diff --git a/dap-sdk b/dap-sdk
index 417a8e53d860dd74d80a257131402a5507be1f62..c9aae9ce01308a85586b770adf02badb6c9c6a39 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 417a8e53d860dd74d80a257131402a5507be1f62
+Subproject commit c9aae9ce01308a85586b770adf02badb6c9c6a39
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 370a919ac37ef36837d2864bc196be379a1f5af2..6f7f30de5096b901005ff1fe5d7237124744ac76 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -7,7 +7,6 @@ endif()
 # Chains
 if (CELLFRAME_MODULES MATCHES "chains")
     add_subdirectory(chain)
-    add_subdirectory(chain/btc_rpc)
     add_subdirectory(wallet)
 endif()
 
@@ -21,6 +20,7 @@ if (CELLFRAME_MODULES MATCHES "network")
     add_subdirectory(mempool)
     add_subdirectory(net)
     add_subdirectory(net/srv)
+    add_subdirectory(json_rpc)
     # Stream channels
     add_subdirectory(channel/chain)
     add_subdirectory(channel/chain-net)
diff --git a/modules/chain/btc_rpc/CMakeLists.txt b/modules/chain/btc_rpc/CMakeLists.txt
deleted file mode 100644
index 3586fae78d0c84ddd6dad1ae39178a251af45873..0000000000000000000000000000000000000000
--- a/modules/chain/btc_rpc/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-project(dap_chain_btc_rpc C)
-cmake_minimum_required(VERSION 3.10)
-
-add_definitions ("-D_GNU_SOURCE")
-add_definitions("-Dfpic")
-
-file(GLOB BTC_RPC_HEADERS include/*.h)
-file(GLOB BTC_RPC_SRCS *.c)
-
-include_directories(${PROJECT_NAME} include/)
-
-add_library(${PROJECT_NAME} STATIC ${BTC_RPC_HEADERS} ${BTC_RPC_SRCS})
-target_include_directories(${PROJECT_NAME} INTERFACE . include/)
-target_include_directories(${PROJECT_NAME} PUBLIC include)
-
-target_link_libraries(${PROJECT_NAME} dap_core dap_json_rpc)
diff --git a/modules/chain/btc_rpc/dap_chain_btc_rpc.c b/modules/chain/btc_rpc/dap_chain_btc_rpc.c
deleted file mode 100644
index 448528116b41719aa8000aa430b130b82a4e334c..0000000000000000000000000000000000000000
--- a/modules/chain/btc_rpc/dap_chain_btc_rpc.c
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "dap_chain_btc_rpc.h"
-
-int dap_chain_btc_rpc_init(){
-    dap_chain_btc_rpc_registration_handlers();
-    return 0;
-}
-void dap_chain_btc_rpc_deinit(){
-    dap_chain_btc_rpc_unregistration_handlers();
-}
diff --git a/modules/chain/btc_rpc/dap_chain_btc_rpc_handlers.c b/modules/chain/btc_rpc/dap_chain_btc_rpc_handlers.c
deleted file mode 100644
index e39ce1a2e702aa9f0b3fe55bf0952526c5241c17..0000000000000000000000000000000000000000
--- a/modules/chain/btc_rpc/dap_chain_btc_rpc_handlers.c
+++ /dev/null
@@ -1,143 +0,0 @@
-#include "dap_chain_btc_rpc_handlers.h"
-
-void dap_chain_btc_rpc_registration_handlers(){
-    dap_json_rpc_registration_request_handler("addmultisigaddress", dap_chain_btc_rpc_handler_addmultisigaddress);
-    dap_json_rpc_registration_request_handler("addnode", dap_chain_btc_rpc_handler_addnode);
-    dap_json_rpc_registration_request_handler("backupwallet", dap_chain_btc_rpc_handler_backupwallet);
-    dap_json_rpc_registration_request_handler("createmultisig", dap_chain_btc_rpc_handler_createmultisig);
-    dap_json_rpc_registration_request_handler("createrawtransaction", dap_chain_btc_rpc_handler_createrawtransaction);
-    dap_json_rpc_registration_request_handler("decoderawtransaction", dap_chain_btc_rpc_handler_decoderawtransaction);
-    dap_json_rpc_registration_request_handler("dumpprivkey", dap_chain_btc_rpc_handler_dumpprivkey);
-    dap_json_rpc_registration_request_handler("dumpwallet", dap_chain_btc_rpc_handler_dumpwallet);
-    dap_json_rpc_registration_request_handler("encryptwallet", dap_chain_btc_rpc_handler_encryptwallet);
-    dap_json_rpc_registration_request_handler("getaccount", dap_chain_btc_rpc_handler_getaccount);
-    dap_json_rpc_registration_request_handler("getaccountaddress", dap_chain_btc_rpc_handler_getaccountaddress);
-    dap_json_rpc_registration_request_handler("getaddednodeinfo", dap_chain_btc_rpc_handler_getaddednodeinfo);
-    dap_json_rpc_registration_request_handler("getaddressesbyaccount", dap_chain_btc_rpc_handler_getaddressesbyaccount);
-    dap_json_rpc_registration_request_handler("getbalance", dap_chain_btc_rpc_handler_getbalance);
-    dap_json_rpc_registration_request_handler("getbestblockhash", dap_chain_btc_rpc_handler_getbestblockhash);
-    dap_json_rpc_registration_request_handler("getblock", dap_chain_btc_rpc_handler_getblock);
-    dap_json_rpc_registration_request_handler("getblockcount", dap_chain_btc_rpc_handler_getblockcount);
-    dap_json_rpc_registration_request_handler("getblockhash", dap_chain_btc_rpc_handler_getblockhash);
-    dap_json_rpc_registration_request_handler("getblocknumber", dap_chain_btc_rpc_handler_getblocknumber);
-    dap_json_rpc_registration_request_handler("getblocktemplate", dap_chain_btc_rpc_handler_getblocktemplate);
-    dap_json_rpc_registration_request_handler("getconnectioncount", dap_chain_btc_rpc_handler_getconnectioncount);
-    dap_json_rpc_registration_request_handler("getdifficulty", dap_chain_btc_rpc_handler_getdifficulty);
-    dap_json_rpc_registration_request_handler("getgenerate", dap_chain_btc_rpc_handler_getgenerate);
-    dap_json_rpc_registration_request_handler("gethashespersec", dap_chain_btc_rpc_handler_gethashespersec);
-    dap_json_rpc_registration_request_handler("getinfo", dap_chain_btc_rpc_handler_getinfo);
-    dap_json_rpc_registration_request_handler("getmemorypool", dap_chain_btc_rpc_handler_getmemorypool);
-    dap_json_rpc_registration_request_handler("getmininginfo", dap_chain_btc_rpc_handler_getmininginfo);
-    dap_json_rpc_registration_request_handler("getnewaddress", dap_chain_btc_rpc_handler_getnewaddress);
-    dap_json_rpc_registration_request_handler("getpeerinfo", dap_chain_btc_rpc_handler_getpeerinfo);
-    dap_json_rpc_registration_request_handler("getrawchangeaddress", dap_chain_btc_rpc_handler_getrawchangeaddress);
-    dap_json_rpc_registration_request_handler("getrawmempool", dap_chain_btc_rpc_handler_getrawmempool);
-    dap_json_rpc_registration_request_handler("getrawtransaction", dap_chain_btc_rpc_handler_getrawtransaction);
-    dap_json_rpc_registration_request_handler("getreceivedbyaccount", dap_chain_btc_rpc_handler_getreceivedbyaccount);
-    dap_json_rpc_registration_request_handler("getreceivedbyaddress", dap_chain_btc_rpc_handler_getreceivedbyaddress);
-    dap_json_rpc_registration_request_handler("gettransaction", dap_chain_btc_rpc_handler_gettransaction);
-    dap_json_rpc_registration_request_handler("gettxout", dap_chain_btc_rpc_handler_gettxout);
-    dap_json_rpc_registration_request_handler("gettxoutsetinfo", dap_chain_btc_rpc_handler_gettxoutsetinfo);
-    dap_json_rpc_registration_request_handler("getwork", dap_chain_btc_rpc_handler_getwork);
-    dap_json_rpc_registration_request_handler("help", dap_chain_btc_rpc_handler_help);
-    dap_json_rpc_registration_request_handler("importprivkey", dap_chain_btc_rpc_handler_importprivkey);
-    dap_json_rpc_registration_request_handler("invalidateblock", dap_chain_btc_rpc_handler_invalidateblock);
-    dap_json_rpc_registration_request_handler("keypoolrefill", dap_chain_btc_rpc_handler_keypoolrefill);
-    dap_json_rpc_registration_request_handler("listaccounts", dap_chain_btc_rpc_handler_listaccounts);
-    dap_json_rpc_registration_request_handler("listaddressgroupings", dap_chain_btc_rpc_handler_listaddressgroupings);
-    dap_json_rpc_registration_request_handler("listreceivedbyaccount", dap_chain_btc_rpc_handler_listreceivedbyaccount);
-    dap_json_rpc_registration_request_handler("listreceivedbyaddress", dap_chain_btc_rpc_handler_listreceivedbyaddress);
-    dap_json_rpc_registration_request_handler("listsinceblock", dap_chain_btc_rpc_handler_listsinceblock);
-    dap_json_rpc_registration_request_handler("listtransactions", dap_chain_btc_rpc_handler_listtransactions);
-    dap_json_rpc_registration_request_handler("listunspent", dap_chain_btc_rpc_handler_listunspent);
-    dap_json_rpc_registration_request_handler("listlockunspent", dap_chain_btc_rpc_handler_listlockunspent);
-    dap_json_rpc_registration_request_handler("lockunspent", dap_chain_btc_rpc_handler_lockunspent);
-    dap_json_rpc_registration_request_handler("move", dap_chain_btc_rpc_handler_move);
-    dap_json_rpc_registration_request_handler("sendfrom", dap_chain_btc_rpc_handler_sendfrom);
-    dap_json_rpc_registration_request_handler("sendmany", dap_chain_btc_rpc_handler_sendmany);
-    dap_json_rpc_registration_request_handler("sendrawtransaction", dap_chain_btc_rpc_handler_sendrawtransaction);
-    dap_json_rpc_registration_request_handler("sendtoaddress", dap_chain_btc_rpc_handler_sendtoaddress);
-    dap_json_rpc_registration_request_handler("setaccount", dap_chain_btc_rpc_handler_setaccount);
-    dap_json_rpc_registration_request_handler("setgenerate", dap_chain_btc_rpc_handler_setgenerate);
-    dap_json_rpc_registration_request_handler("settxfee", dap_chain_btc_rpc_handler_settxfee);
-    dap_json_rpc_registration_request_handler("signmessage", dap_chain_btc_rpc_handler_signmessage);
-    dap_json_rpc_registration_request_handler("signrawtransaction", dap_chain_btc_rpc_handler_signrawtransaction);
-    dap_json_rpc_registration_request_handler("stop", dap_chain_btc_rpc_handler_stop);
-    dap_json_rpc_registration_request_handler("submitblock", dap_chain_btc_rpc_handler_submitblock);
-    dap_json_rpc_registration_request_handler("validateaddress", dap_chain_btc_rpc_handler_validateaddress);
-    dap_json_rpc_registration_request_handler("verifymessage", dap_chain_btc_rpc_handler_verifymessage);
-    dap_json_rpc_registration_request_handler("walletlock", dap_chain_btc_rpc_handler_walletlock);
-    dap_json_rpc_registration_request_handler("walletpassphrase", dap_chain_btc_rpc_handler_walletpassphrase);
-    dap_json_rpc_registration_request_handler("walletpassphrasechange", dap_chain_btc_rpc_handler_walletpassphrasechange);
-}
-
-void dap_chain_btc_rpc_unregistration_handlers(){
-    dap_json_rpc_unregistration_request_handler("addmultisigaddress");
-    dap_json_rpc_unregistration_request_handler("addnode");
-    dap_json_rpc_unregistration_request_handler("backupwallet");
-    dap_json_rpc_unregistration_request_handler("createmultisig");
-    dap_json_rpc_unregistration_request_handler("createrawtransaction");
-    dap_json_rpc_unregistration_request_handler("decoderawtransaction");
-    dap_json_rpc_unregistration_request_handler("dumpprivkey");
-    dap_json_rpc_unregistration_request_handler("dumpwallet");
-    dap_json_rpc_unregistration_request_handler("encryptwallet");
-    dap_json_rpc_unregistration_request_handler("getaccount");
-    dap_json_rpc_unregistration_request_handler("getaccountaddress");
-    dap_json_rpc_unregistration_request_handler("getaddednodeinfo");
-    dap_json_rpc_unregistration_request_handler("getaddressesbyaccount");
-    dap_json_rpc_unregistration_request_handler("getbalance");
-    dap_json_rpc_unregistration_request_handler("getbestblockhash");
-    dap_json_rpc_unregistration_request_handler("getblock");
-    dap_json_rpc_unregistration_request_handler("getblockcount");
-    dap_json_rpc_unregistration_request_handler("getblockhash");
-    dap_json_rpc_unregistration_request_handler("getblocknumber");
-    dap_json_rpc_unregistration_request_handler("getblocktemplate");
-    dap_json_rpc_unregistration_request_handler("getconnectioncount");
-    dap_json_rpc_unregistration_request_handler("getdifficulty");
-    dap_json_rpc_unregistration_request_handler("getgenerate");
-    dap_json_rpc_unregistration_request_handler("gethashespersec");
-    dap_json_rpc_unregistration_request_handler("getinfo");
-    dap_json_rpc_unregistration_request_handler("getmemorypool");
-    dap_json_rpc_unregistration_request_handler("getmininginfo");
-    dap_json_rpc_unregistration_request_handler("getnewaddress");
-    dap_json_rpc_unregistration_request_handler("getpeerinfo");
-    dap_json_rpc_unregistration_request_handler("getrawchangeaddress");
-    dap_json_rpc_unregistration_request_handler("getrawmempool");
-    dap_json_rpc_unregistration_request_handler("getrawtransaction");
-    dap_json_rpc_unregistration_request_handler("getreceivedbyaccount");
-    dap_json_rpc_unregistration_request_handler("getreceivedbyaddress");
-    dap_json_rpc_unregistration_request_handler("gettransaction");
-    dap_json_rpc_unregistration_request_handler("gettxout");
-    dap_json_rpc_unregistration_request_handler("gettxoutsetinfo");
-    dap_json_rpc_unregistration_request_handler("getwork");
-    dap_json_rpc_unregistration_request_handler("help");
-    dap_json_rpc_unregistration_request_handler("importprivkey");
-    dap_json_rpc_unregistration_request_handler("invalidateblock");
-    dap_json_rpc_unregistration_request_handler("keypoolrefill");
-    dap_json_rpc_unregistration_request_handler("listaccounts");
-    dap_json_rpc_unregistration_request_handler("listaddressgroupings");
-    dap_json_rpc_unregistration_request_handler("listreceivedbyaccount");
-    dap_json_rpc_unregistration_request_handler("listreceivedbyaddress");
-    dap_json_rpc_unregistration_request_handler("listsinceblock");
-    dap_json_rpc_unregistration_request_handler("listtransactions");
-    dap_json_rpc_unregistration_request_handler("listunspent");
-    dap_json_rpc_unregistration_request_handler("listlockunspent");
-    dap_json_rpc_unregistration_request_handler("lockunspent");
-    dap_json_rpc_unregistration_request_handler("move");
-    dap_json_rpc_unregistration_request_handler("sendfrom");
-    dap_json_rpc_unregistration_request_handler("sendmany");
-    dap_json_rpc_unregistration_request_handler("sendrawtransaction");
-    dap_json_rpc_unregistration_request_handler("sendtoaddress");
-    dap_json_rpc_unregistration_request_handler("setaccount");
-    dap_json_rpc_unregistration_request_handler("setgenerate");
-    dap_json_rpc_unregistration_request_handler("settxfee");
-    dap_json_rpc_unregistration_request_handler("signmessage");
-    dap_json_rpc_unregistration_request_handler("signrawtransaction");
-    dap_json_rpc_unregistration_request_handler("stop");
-    dap_json_rpc_unregistration_request_handler("submitblock");
-    dap_json_rpc_unregistration_request_handler("validateaddress");
-    dap_json_rpc_unregistration_request_handler("verifymessage");
-    dap_json_rpc_unregistration_request_handler("walletlock");
-    dap_json_rpc_unregistration_request_handler("walletpassphrase");
-    dap_json_rpc_unregistration_request_handler("walletpassphrasechange");
-}
diff --git a/modules/chain/btc_rpc/include/dap_chain_btc_rpc.h b/modules/chain/btc_rpc/include/dap_chain_btc_rpc.h
deleted file mode 100644
index 1196448f3ed1a4f94a81d491c3e3c9ace35cd16d..0000000000000000000000000000000000000000
--- a/modules/chain/btc_rpc/include/dap_chain_btc_rpc.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#pragma once
-#include "dap_chain_btc_rpc_handlers.h"
-
-int dap_chain_btc_rpc_init();
-void dap_chain_btc_rpc_deinit();
diff --git a/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h b/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h
deleted file mode 100644
index d019041e44c27b02433a00892f8143d33cb1cec5..0000000000000000000000000000000000000000
--- a/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#pragma once
-
-#include "dap_json_rpc_request_handler.h"
-
-void dap_chain_btc_rpc_registration_handlers();
-void dap_chain_btc_rpc_unregistration_handlers();
-
-void dap_chain_btc_rpc_handler_addmultisigaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_addnode(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_backupwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_createmultisig(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_createrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_decoderawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_dumpprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_dumpwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_encryptwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getaccountaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getaddednodeinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getaddressesbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getbalance(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getbestblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getblockcount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getblocknumber(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getblocktemplate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getconnectioncount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getdifficulty(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_gethashespersec(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getmemorypool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getmininginfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-void dap_chain_btc_rpc_handler_getnewaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getpeerinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getrawchangeaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getrawmempool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_gettransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_gettxout(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_gettxoutsetinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_getwork(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-void dap_chain_btc_rpc_handler_help(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-void dap_chain_btc_rpc_handler_importprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_invalidateblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_keypoolrefill(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listaccounts(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listaddressgroupings(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listsinceblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listtransactions(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_listlockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_lockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_move(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-void dap_chain_btc_rpc_handler_sendfrom(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_sendmany(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_sendrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_sendtoaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_setaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_setgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_settxfee(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_signmessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_signrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_stop(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_submitblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-void dap_chain_btc_rpc_handler_validateaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_verifymessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_walletlock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_walletpassphrase(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-void dap_chain_btc_rpc_handler_walletpassphrasechange(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method);
-
-
diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt
index 08bba6401c2d7dadbf5acc6222342c9a6592c74b..7b6258a44bebf4858ec217732df0f3d103482c62 100644
--- a/modules/common/CMakeLists.txt
+++ b/modules/common/CMakeLists.txt
@@ -10,7 +10,7 @@ if(BUILD_CELLFRAME_SDK_TESTS)
     add_subdirectory(tests)
 endif()
 
-target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_json-c)
+target_link_libraries(${PROJECT_NAME} dap_core dap_crypto)
 target_include_directories(${PROJECT_NAME} PUBLIC include/ )
 target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../dap-sdk/3rdparty/json-c)
 
diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c
index 098ddeba453baf2c9cb8ca966cf134242da5040d..294cb43cf3d393e29c826f57dc143783d4deebbd 100644
--- a/modules/common/dap_chain_common.c
+++ b/modules/common/dap_chain_common.c
@@ -77,18 +77,6 @@ size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, s
     return strlen(a_str);
 }
 
-/**
- * @brief dap_chain_addr_to_json
- * @param a_addr
- * @return
- */
-json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr){
-    char *l_addr_str = dap_chain_addr_to_str(a_addr);
-    json_object *l_obj = json_object_new_string(l_addr_str);
-    DAP_DELETE(l_addr_str);
-    return l_obj;
-}
-
 /**
  * @brief dap_chain_addr_to_str
  * @param a_addr
diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c
index ccfc881503f24d18e70965bee016fb0b4ee3fc73..4fec72ab3cda6f4b634a94e635641b41b54fec82 100644
--- a/modules/common/dap_chain_datum.c
+++ b/modules/common/dap_chain_datum.c
@@ -788,30 +788,3 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c
     }    
     DAP_DELETE(l_hash_str);
 }
-
-json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum){
-    json_object *l_object = json_object_new_object();
-    char *l_hash_data_str;
-    dap_get_data_hash_str_static(a_datum->data, a_datum->header.data_size, l_hash_data_str);
-    json_object *l_obj_data_hash = json_object_new_string(l_hash_data_str);
-    json_object *l_obj_version = json_object_new_int(a_datum->header.version_id);
-    json_object *l_obj_size = json_object_new_int(a_datum->header.data_size);
-    json_object *l_obj_ts_created = json_object_new_uint64(a_datum->header.ts_create);
-    json_object *l_obj_type = json_object_new_string(dap_chain_datum_type_id_to_str(a_datum->header.type_id));
-    json_object *l_obj_data;
-    switch (a_datum->header.type_id) {
-        case DAP_CHAIN_DATUM_TX:
-            l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data);
-            break;
-        default:
-            l_obj_data = json_object_new_null();
-            break;
-    }
-    json_object_object_add(l_object, "version", l_obj_version);
-    json_object_object_add(l_object, "hash", l_obj_data_hash);
-    json_object_object_add(l_object, "data_size", l_obj_size);
-    json_object_object_add(l_object, "ts_created", l_obj_ts_created);
-    json_object_object_add(l_object, "type", l_obj_type);
-    json_object_object_add(l_object, "data", l_obj_data);
-    return l_object;
-}
diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c
index 78e9268f6cfe6ab99a056db72c191dafb6697641..0f2310fb974bf9ed1e37b7a1095171ed65497ea4 100644
--- a/modules/common/dap_chain_datum_tx.c
+++ b/modules/common/dap_chain_datum_tx.c
@@ -317,104 +317,3 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx)
     assert(tx_items_pos == tx_items_size);
     return ret;
 }
-
-json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){
-    json_object *l_obj = json_object_new_object();
-    json_object *l_obj_ts_created = json_object_new_uint64(a_tx->header.ts_created);
-    json_object *l_obj_items = json_object_new_array();
-    uint32_t l_tx_items_count = 0;
-    uint32_t l_tx_items_size = a_tx->header.tx_items_size;
-    while(l_tx_items_count < l_tx_items_size) {
-        uint8_t *item = a_tx->tx_items + l_tx_items_count;
-        size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item);
-        if (l_tx_item_size == 0) {
-            json_object_put(l_obj_items);
-            l_obj_items = json_object_new_null();
-            break;
-        }
-        dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(item);
-        json_object *l_obj_item_type = NULL, *l_obj_item_data = NULL;
-        switch (l_item_type) {
-            case TX_ITEM_TYPE_IN:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN");
-                l_obj_item_data = dap_chain_datum_tx_item_in_to_json((dap_chain_tx_in_t*)item);
-                break;
-            case TX_ITEM_TYPE_OUT:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT");
-                l_obj_item_data = dap_chain_datum_tx_item_out_to_json((dap_chain_tx_out_t*)item);
-                break;
-            case TX_ITEM_TYPE_IN_EMS:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_EMS");
-                l_obj_item_data = dap_chain_datum_tx_item_in_ems_to_json((dap_chain_tx_in_ems_t*)item);
-                break;
-            case TX_ITEM_TYPE_SIG:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_SIG");
-                l_obj_item_data = dap_chain_datum_tx_item_sig_to_json((dap_chain_tx_sig_t*)item);
-                break;
-            case TX_ITEM_TYPE_RECEIPT:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_RECEIPT");
-                l_obj_item_data = dap_chain_datum_tx_receipt_to_json((dap_chain_datum_tx_receipt_t*)item);
-                break;
-            case TX_ITEM_TYPE_IN_COND:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_COND");
-                l_obj_item_data = dap_chain_datum_tx_item_in_cond_to_json((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:
-                        l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY");
-                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_pay_to_json((dap_chain_tx_out_cond_t*)item);
-                        break;
-                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK:
-                        l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK");
-                        l_obj_item_data = dap_chain_net_srv_stake_lock_cond_out_to_json((dap_chain_tx_out_cond_t*)item);
-                        break;
-                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE:
-                        l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE");
-                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_stake_to_json((dap_chain_tx_out_cond_t*)item);
-                        break;
-                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:
-                        l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE");
-                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_xchange_to_json((dap_chain_tx_out_cond_t*)item);
-                        break;
-                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE:
-                        l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE");
-                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_fee_to_json((dap_chain_tx_out_cond_t*)item);
-                        break;
-//                    default:
-                }
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_COND");
-                break;
-            case TX_ITEM_TYPE_OUT_EXT:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_EXT");
-                l_obj_item_data = dap_chain_datum_tx_item_out_ext_to_json((dap_chain_tx_out_ext_t*)item);
-                break;
-            case TX_ITEM_TYPE_TSD:
-                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_TSD");
-                l_obj_item_data = dap_chain_datum_tx_item_tsd_to_json((dap_chain_tx_tsd_t*)item);
-                break;
-            default: {
-                char *l_hash_str;
-                dap_get_data_hash_str_static(a_tx, dap_chain_datum_tx_get_size(a_tx), l_hash_str);
-                log_it(L_NOTICE, "Transaction %s has an item whose type cannot be handled by the dap_chain_datum_tx_to_json function.", l_hash_str);
-                break;
-            }
-        }
-        if (!l_obj_item_type){
-            json_object_array_add(l_obj_items, json_object_new_null());
-        } else {
-            if (!l_obj_item_data)
-                l_obj_item_data = json_object_new_null();
-            json_object *l_obj_item = json_object_new_object();
-            json_object_object_add(l_obj_item, "type", l_obj_item_type);
-            json_object_object_add(l_obj_item, "data", l_obj_item_data);
-            json_object_array_add(l_obj_items, l_obj_item);
-        }
-
-        l_tx_items_count += l_tx_item_size;
-    }
-    json_object_object_add(l_obj, "tsCrated", l_obj_ts_created);
-    json_object_object_add(l_obj, "items", l_obj_items);
-    return l_obj;
-}
-
diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c
index e27960b2e989a47d177ec1b9f248e60a32513d3e..32803e8a9dcc4a33ee7c800c9094b5339f21936a 100644
--- a/modules/common/dap_chain_datum_tx_items.c
+++ b/modules/common/dap_chain_datum_tx_items.c
@@ -251,20 +251,6 @@ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_in_ems_create(dap_chain_id_t a_id
     return l_item;
 }
 
-json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems)
-{
-    json_object *l_object = json_object_new_object();
-    json_object *l_obj_ticker = json_object_new_string(a_in_ems->header.ticker);
-    json_object *l_obj_chain_id = json_object_new_uint64(a_in_ems->header.token_emission_chain_id.uint64);
-    char l_ehf[DAP_CHAIN_HASH_FAST_STR_SIZE];
-    dap_chain_hash_fast_to_str(&a_in_ems->header.token_emission_hash, l_ehf, sizeof(l_ehf));
-    json_object *l_obj_ehf = json_object_new_string(l_ehf);
-    json_object_object_add(l_object, "ticker", l_obj_ticker);
-    json_object_object_add(l_object, "chainId", l_obj_chain_id);
-    json_object_object_add(l_object, "emissionHash", l_obj_ehf);
-    return l_object;
-}
-
 /**
  * Create item dap_chain_tx_out_old_t
  *
@@ -313,28 +299,6 @@ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type,
     return l_item;
 }
 
-json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){
-    json_object *l_obj_in = json_object_new_object();
-    json_object *l_obj_prev_idx = json_object_new_uint64(a_in->header.tx_out_prev_idx);
-    char l_hash[DAP_CHAIN_HASH_FAST_STR_SIZE];
-    dap_chain_hash_fast_to_str(&a_in->header.tx_prev_hash, l_hash, sizeof(l_hash));
-    json_object *l_obj_hash = json_object_new_string(l_hash);
-    json_object_object_add(l_obj_in, "prev_idx", l_obj_prev_idx);
-    json_object_object_add(l_obj_in, "prev_hash", l_obj_hash);
-    return l_obj_in;
-}
-
-json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd){
-    json_object *l_object = json_object_new_object();
-    json_object *l_obj_tsd_type = json_object_new_int(a_tsd->header.type);
-    json_object *l_obj_tsd_size = json_object_new_uint64(a_tsd->header.size);
-    json_object *l_obj_data = json_object_new_string_len((char *)a_tsd->tsd, a_tsd->header.size);
-    json_object_object_add(l_object, "type", l_obj_tsd_type);
-    json_object_object_add(l_object, "size", l_obj_tsd_size);
-    json_object_object_add(l_object, "data", l_obj_data);
-    return l_object;
-}
-
 /**
  * @brief dap_chain_datum_tx_item_in_cond_create
  * @param a_pkey_serialized
@@ -358,24 +322,6 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
     return l_item;
 }
 
-json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond){
-    json_object *l_obj = json_object_new_object();
-    json_object *l_obj_receipt_idx = json_object_new_uint64(a_in_cond->header.receipt_idx);
-    json_object *l_obj_out_prev_idx = json_object_new_uint64(a_in_cond->header.tx_out_prev_idx);
-    json_object *l_obj_prev_hash = NULL;
-    if (dap_hash_fast_is_blank(&a_in_cond->header.tx_prev_hash)){
-        l_obj_prev_hash = json_object_new_null();
-    } else {
-        char *l_prev_hash = dap_hash_fast_to_str_new(&a_in_cond->header.tx_prev_hash);
-        l_obj_prev_hash = json_object_new_string(dap_strdup(l_prev_hash));
-        DAP_DELETE(l_prev_hash);
-    }
-    json_object_object_add(l_obj, "receiptIdx", l_obj_receipt_idx);
-    json_object_object_add(l_obj, "outPrevIdx", l_obj_out_prev_idx);
-    json_object_object_add(l_obj, "txPrevHash", l_obj_prev_hash);
-    return l_obj;
-}
-
 /**
  * Create item dap_chain_tx_out_old_t
  *
@@ -395,15 +341,6 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a
     return l_item;
 }
 
-json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out) {
-    json_object *l_object = json_object_new_object();
-    json_object *l_value = json_object_new_string(dap_chain_balance_print(a_out->header.value));
-    json_object *l_addr = dap_chain_addr_to_json(&a_out->addr);
-    json_object_object_add(l_object, "value", l_value);
-    json_object_object_add(l_object, "addr", l_addr);
-    return l_object;
-}
-
 dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
 {
     if (!a_addr || !a_token)
@@ -421,19 +358,6 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a
     return l_item;
 }
 
-json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext) {
-    json_object *l_obj = json_object_new_object();
-    char *l_value = dap_chain_balance_print(a_out_ext->header.value);
-    json_object *l_obj_value = json_object_new_string(l_value);
-    DAP_DELETE(l_value);
-    json_object *l_obj_addr = dap_chain_addr_to_json(&a_out_ext->addr);
-    json_object *l_obj_token = json_object_new_string(a_out_ext->token);
-    json_object_object_add(l_obj, "value", l_obj_value);
-    json_object_object_add(l_obj, "addr", l_obj_addr);
-    json_object_object_add(l_obj, "token", l_obj_token);
-    return l_obj;
-}
-
 dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a_value)
 {
     if (IS_ZERO_256(a_value))
@@ -448,18 +372,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a
     return l_item;
 }
 
-json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee){
-    if (a_fee->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) {
-        json_object *l_obj = json_object_new_object();
-        char *l_balance = dap_chain_balance_print(a_fee->header.value);
-        json_object *l_obj_balance = json_object_new_string(l_balance);
-        DAP_DELETE(l_balance);
-        json_object_object_add(l_obj, "balance", l_obj_balance);
-        return l_obj;
-    }
-    return NULL;
-}
-
 /**
  * Create item dap_chain_tx_out_cond_t
  *
@@ -492,33 +404,6 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke
     return l_item;
 }
 
-json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *a_srv_pay) {
-    if (a_srv_pay->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY) {
-        json_object *l_obj = json_object_new_object();
-        char *l_balance = dap_chain_balance_print(a_srv_pay->header.value);
-        json_object *l_obj_value = json_object_new_string(l_balance);
-        DAP_DELETE(l_balance);
-        json_object_object_add(l_obj, "value", l_obj_value);
-        json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_pay->header.srv_uid.uint64);
-        json_object_object_add(l_obj, "srvUid", l_obj_srv_uid);
-        json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_srv_pay->subtype.srv_pay.unit.enm));
-        json_object_object_add(l_obj, "srvUnit", l_obj_units_type);
-        char *l_price_max_datoshi = dap_chain_balance_print(a_srv_pay->subtype.srv_pay.unit_price_max_datoshi);
-        json_object *l_obj_price_max_datoshi = json_object_new_string(l_price_max_datoshi);
-        DAP_DELETE(l_price_max_datoshi);
-        json_object_object_add(l_obj, "price", l_obj_price_max_datoshi);
-        char *l_pkeyHash = dap_hash_fast_to_str_new(&a_srv_pay->subtype.srv_pay.pkey_hash);
-        json_object *l_obj_pkey_hash = json_object_new_string(l_pkeyHash);
-        DAP_DELETE(l_pkeyHash);
-        json_object_object_add(l_obj, "pKeyHash", l_obj_pkey_hash);
-        //TODO: Parsing a_srv_pay->tsd
-//        json_object *l_obj_tsd = json_object_new_string_len(a_srv_pay->tsd, a_srv_pay->tsd_size);
-//        json_object_object_add(l_obj, "TSD", l_obj_tsd);
-        return l_obj;
-    }
-    return NULL;
-}
-
 dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_sell_net_id,
                                                                              uint256_t a_value_sell, dap_chain_net_id_t a_buy_net_id,
                                                                              const char *a_token, uint256_t a_value_rate,
@@ -546,33 +431,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap
     return l_item;
 }
 
-json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange){
-    if (a_srv_xchange->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE){
-        json_object *l_object = json_object_new_object();
-        char *l_value = dap_chain_balance_print(a_srv_xchange->header.value);
-        json_object *l_obj_value = json_object_new_string(l_value);
-        DAP_DELETE(l_value);
-        json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_xchange->header.srv_uid.uint64);
-        json_object *l_obj_buy_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.buy_net_id);
-        json_object *l_obj_sell_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.sell_net_id);
-        json_object *l_obj_buy_token = json_object_new_string(a_srv_xchange->subtype.srv_xchange.buy_token);
-        char *l_value_rate = dap_chain_balance_print(a_srv_xchange->subtype.srv_xchange.rate);
-        json_object *l_obj_value_rate = json_object_new_string(l_value_rate);
-        DAP_DELETE(l_value_rate);
-        json_object *l_obj_seller_addr = dap_chain_addr_to_json(&a_srv_xchange->subtype.srv_xchange.seller_addr);
-        json_object_object_add(l_object, "value", l_obj_value);
-        json_object_object_add(l_object, "valueRate", l_obj_value_rate);
-        json_object_object_add(l_object, "srvUID", l_obj_srv_uid);
-        json_object_object_add(l_object, "buyNetId", l_obj_buy_net_id);
-        json_object_object_add(l_object, "sellNetId", l_obj_sell_net_id);
-        json_object_object_add(l_object, "buyToken", l_obj_buy_token);
-        json_object_object_add(l_object, "sellerAddr", l_obj_seller_addr);
-        //TODO: Parse TSD
-        return l_object;
-    }
-    return NULL;
-}
-
 dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value,
                                                                            dap_chain_addr_t *a_signing_addr, dap_chain_node_addr_t *a_signer_node_addr,
                                                                            dap_chain_addr_t *a_sovereign_addr, uint256_t a_sovereign_tax)
@@ -599,28 +457,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c
     return l_item;
 }
 
-json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake) {
-    if (a_srv_stake->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE) {
-        json_object *l_object = json_object_new_object();
-        char *l_value = dap_chain_balance_print(a_srv_stake->header.value);
-        json_object *l_obj_value = json_object_new_string(l_value);
-        DAP_DELETE(l_value);
-        json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_stake->header.srv_uid.uint64);
-        json_object *l_obj_signing_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake_pos_delegate.signing_addr);
-        char *l_signer_node_addr = dap_strdup_printf(
-                NODE_ADDR_FP_STR,
-                NODE_ADDR_FP_ARGS_S(a_srv_stake->subtype.srv_stake_pos_delegate.signer_node_addr));
-        json_object *l_obj_signer_node_addr = json_object_new_string(l_signer_node_addr);
-        DAP_DELETE(l_signer_node_addr);
-        json_object_object_add(l_object, "value", l_obj_value);
-        json_object_object_add(l_object, "srvUID", l_obj_srv_uid);
-        json_object_object_add(l_object, "signindAddr", l_obj_signing_addr);
-        json_object_object_add(l_object, "signerNodeAddr", l_obj_signer_node_addr);
-        return l_object;
-    }
-    return NULL;
-}
-
 /**
  * @brief dap_chain_net_srv_stake_lock_create_cond_out
  * @param a_key
@@ -650,29 +486,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake_lock(
     return l_item;
 }
 
-json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock)
-{
-    if (a_stake_lock->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) {
-        json_object *l_object = json_object_new_object();
-        char *l_value = dap_chain_balance_print(a_stake_lock->header.value);
-        json_object *l_obj_value = json_object_new_string(l_value);
-        DAP_DELETE(l_value);
-        json_object *l_obj_srv_uid = json_object_new_uint64(a_stake_lock->header.srv_uid.uint64);
-        char *l_reinvest_precent = dap_chain_balance_print(a_stake_lock->subtype.srv_stake_lock.reinvest_percent);
-        json_object *l_obj_reinvest_percent = json_object_new_string(l_reinvest_precent);
-        DAP_DELETE(l_reinvest_precent);
-        json_object *l_obj_time_unlock = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.time_unlock);
-        json_object *l_obj_flags = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.flags);
-        json_object_object_add(l_object, "value", l_obj_value);
-        json_object_object_add(l_object, "srvUID", l_obj_srv_uid);
-        json_object_object_add(l_object, "reinvestPercent", l_obj_reinvest_percent);
-        json_object_object_add(l_object, "timeUnlock", l_obj_time_unlock);
-        json_object_object_add(l_object, "flags", l_obj_flags);
-        return l_object;
-    }
-    return NULL;
-}
-
 /**
  * Create item dap_chain_tx_sig_t
  *
@@ -696,15 +509,6 @@ dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, co
     return l_tx_sig;
 }
 
-json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig){
-    json_object *l_object = json_object_new_object();
-    json_object *l_sign_size = json_object_new_uint64(a_sig->header.sig_size);
-    json_object *l_sign = dap_sign_to_json((dap_sign_t*)a_sig->sig);
-    json_object_object_add(l_object, "signSize", l_sign_size);
-    json_object_object_add(l_object, "sign", l_sign);
-    return l_object;
-}
-
 /**
  * Get sign from sign item
  *
diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c
index 43e607dcec37cf65ca412dc32894f3b0214a074c..068bd365b83e2be92812e311cedf8c8d007b005a 100644
--- a/modules/common/dap_chain_datum_tx_receipt.c
+++ b/modules/common/dap_chain_datum_tx_receipt.c
@@ -160,42 +160,3 @@ uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * a
         log_it(L_ERROR, "Receipt 0x%zu (size=%zu) is corrupted", (size_t)a_receipt, a_receipt_size);
     return l_ret;
 }
-
-
-json_object* dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info){
-    json_object *l_obj = json_object_new_object();
-    json_object *l_obj_srv_uid = json_object_new_uint64(a_info->srv_uid.uint64);
-    json_object_object_add(l_obj, "srvUID", l_obj_srv_uid);
-#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
-    json_object *l_obj_addition = json_object_new_uint64(a_info->addition);
-    json_object_object_add(l_obj, "addition", l_obj_addition);
-#endif
-    json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_info->units_type.enm));
-    json_object_object_add(l_obj, "unitsType", l_obj_units_type);
-    char *l_datoshi_value = dap_chain_balance_print(a_info->value_datoshi);
-    json_object *l_obj_datoshi = json_object_new_string(l_datoshi_value);
-    DAP_DELETE(l_datoshi_value);
-    json_object_object_add(l_obj, "value", l_obj_datoshi);
-    return l_obj;
-}
-
-json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt) {
-    json_object *l_obj = json_object_new_object();
-    json_object *l_obj_info = dap_chain_receipt_info_to_json(&a_receipt->receipt_info);
-    json_object *l_obj_size = json_object_new_uint64(a_receipt->size);
-    //Provider
-    dap_sign_t *l_first_sign  = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 1);
-    //Client
-    dap_sign_t *l_second_sign  = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 2);
-    json_object *l_obj_signs = json_object_new_object();
-    json_object *l_obj_provider_sign = dap_sign_to_json(l_first_sign);
-    json_object *l_obj_client_sign = dap_sign_to_json(l_second_sign);
-    json_object_object_add(l_obj_signs, "provider", l_obj_provider_sign);
-    json_object_object_add(l_obj_signs, "client", l_obj_client_sign);
-    json_object *l_exts_data = json_object_new_string_len((char *)a_receipt->exts_n_signs, a_receipt->exts_size);
-    json_object_object_add(l_obj, "info", l_obj_info);
-    json_object_object_add(l_obj, "size", l_obj_size);
-    json_object_object_add(l_obj, "sings", l_obj_signs);
-    json_object_object_add(l_obj, "extsData", l_exts_data);
-    return l_obj;
-}
diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h
index ddef34874a871a6bea7b20ee5125e6ea6ddb6efd..fc2924bdfeb597c044e26b39fec7334282c5ec4f 100644
--- a/modules/common/include/dap_chain_common.h
+++ b/modules/common/include/dap_chain_common.h
@@ -216,14 +216,9 @@ extern "C" {
 size_t dap_chain_hash_slow_to_str(dap_chain_hash_slow_t * a_hash, char * a_str, size_t a_str_max);
 
 char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr);
-json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr);
 dap_chain_addr_t* dap_chain_addr_from_str(const char *str);
 bool dap_chain_addr_is_blank(const dap_chain_addr_t *a_addr);
 
-DAP_STATIC_INLINE json_object *dap_chain_net_id_to_json(dap_chain_net_id_t a_net_id) {
-    return json_object_new_uint64(a_net_id.uint64);
-}
-
 dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str(const char* a_str);
 
 void dap_chain_addr_fill(dap_chain_addr_t *a_addr, dap_sign_type_t a_type, dap_chain_hash_fast_t *a_pkey_hash, dap_chain_net_id_t a_net_id);
diff --git a/modules/json_rpc/CMakeLists.txt b/modules/json_rpc/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..526bc29d7597ec77286a5fbfc59ee15b9c307131
--- /dev/null
+++ b/modules/json_rpc/CMakeLists.txt
@@ -0,0 +1,3 @@
+
+add_subdirectory(mempool)
+add_subdirectory(common)
diff --git a/modules/json_rpc/common/CMakeLists.txt b/modules/json_rpc/common/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4cd22f12205316ba754833b58898fb4fb6c748e0
--- /dev/null
+++ b/modules/json_rpc/common/CMakeLists.txt
@@ -0,0 +1,10 @@
+cmake_minimum_required(VERSION 3.10)
+project(dap_json_rpc_chain_common)
+
+file(GLOB DAP_JSON_RPC_CHAIN_COMMON_HEADERS include/*.h)
+file(GLOB DAP_JSON_RPC_CHAIN_COMMON_SRCS *.c)
+
+add_library(${PROJECT_NAME}  STATIC ${DAP_JSON_RPC_CHAIN_COMMON_SRCS} ${DAP_JSON_RPC_CHAIN_COMMON_HEADERS})
+
+target_link_libraries(dap_json_rpc_chain_common dap_core dap_crypto dap_chain_common dap_json-c dap_json_rpc_core dap_json_rpc_crypto)
+target_include_directories(dap_json_rpc_chain_common PUBLIC include/)
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_common.c b/modules/json_rpc/common/dap_json_rpc_chain_common.c
new file mode 100644
index 0000000000000000000000000000000000000000..fbf2ed3eea23a0a840350eef8496c2b150a72a1e
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_common.c
@@ -0,0 +1,24 @@
+#include "dap_json_rpc_chain_common.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_common"
+
+/**
+ * @brief dap_chain_addr_to_json
+ * @param a_addr
+ * @return
+ */
+json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr){
+    char *l_addr_str = dap_chain_addr_to_str(a_addr);
+    if (!l_addr_str) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj = json_object_new_string(l_addr_str);
+    DAP_DELETE(l_addr_str);
+    if (!l_obj) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    return l_obj;
+}
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum.c b/modules/json_rpc/common/dap_json_rpc_chain_datum.c
new file mode 100644
index 0000000000000000000000000000000000000000..1590afbe227224db66fc16bfbb9d8bcd023d0c40
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum.c
@@ -0,0 +1,775 @@
+
+#include "dap_common.h"
+#include "dap_time.h"
+#include "dap_chain_datum.h"
+#include "dap_chain_datum_tx.h"
+#include "dap_chain_datum_token.h"
+#include "dap_chain_datum_tx_items.h"
+#include "dap_chain_datum_decree.h"
+#include "dap_chain_datum_anchor.h"
+#include "dap_chain_datum_hashtree_roots.h"
+#include "dap_enc_base58.h"
+
+#include "dap_json_rpc_chain_datum.h"
+#include "dap_json_rpc_chain_datum_tx.h"
+#include "dap_json_rpc_chain_datum_token.h"
+#include "dap_json_rpc_chain_datum_anchor.h"
+#include "dap_json_rpc_chain_datum_decree.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_datum"
+
+json_object *s_dap_chain_datum_token_tsd_to_json(dap_chain_datum_token_t *a_token, size_t a_token_size) {
+    dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(a_token, a_token_size);
+    if (l_tsd == NULL) {
+        json_object *l_tsd_wgn = json_object_new_object();
+        if (!l_tsd_wgn){
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_tsd_wgn_warning = json_object_new_string("<CORRUPTED TSD SECTION>");
+        if (!l_tsd_wgn_warning) {
+            json_object_put(l_tsd_wgn);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object_object_add(l_tsd_wgn, "warning", l_tsd_wgn_warning);
+        return l_tsd_wgn;
+    }
+    json_object *l_tsd_array = json_object_new_array();
+    if (!l_tsd_array) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    size_t l_tsd_total_size = 0;
+    switch (a_token->type) {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL:
+            switch (a_token->subtype) {
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE:
+                    l_tsd_total_size = a_token->header_private_decl.tsd_total_size; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE:
+                    l_tsd_total_size = a_token->header_native_decl.tsd_total_size; break;
+                default: break;
+            } break;
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE:
+            switch (a_token->subtype) {
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE:
+                    l_tsd_total_size = a_token->header_private_update.tsd_total_size; break;
+                case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE:
+                    l_tsd_total_size = a_token->header_native_update.tsd_total_size; break;
+                default: break;
+            } break;
+        default: break;
+    }
+    size_t l_tsd_size = 0;
+    for (size_t l_offset = 0; l_offset < l_tsd_total_size; l_offset += l_tsd_size) {
+        json_object *l_jobj_tsd = json_object_new_object();
+        l_tsd = (dap_tsd_t *) (((byte_t*)l_tsd) + l_tsd_size);
+        l_tsd_size = l_tsd ? dap_tsd_size(l_tsd) : 0;
+        if (l_tsd_size == 0) {
+            json_object *l_wgn_text = json_object_new_string("Wrong zero TSD size, exiting s_datum_token_dump_tsd()");
+            if (!l_wgn_text) {
+                json_object_put(l_tsd_array);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object *l_wgn = json_object_new_object();
+            if (!l_wgn) {
+                json_object_put(l_wgn_text);
+                json_object_put(l_tsd_array);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_wgn, "error", l_wgn_text);
+            json_object_array_add(l_tsd_array, l_wgn);
+            break;
+        } else if (l_tsd_size+l_offset > l_tsd_total_size) {
+            char *l_wgn_str = dap_strdup_printf("<CORRUPTED TSD> too big size %u when left maximum %zu",
+                                           l_tsd->size, l_tsd_total_size - l_offset);
+            if (!l_wgn_str) {
+                json_object_put(l_tsd_array);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object *l_wgn_text = json_object_new_string(l_wgn_str);
+            DAP_DELETE(l_wgn_str);
+            if (!l_wgn_text) {
+                json_object_put(l_tsd_array);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object *l_wgn = json_object_new_object();
+            if (!l_wgn) {
+                json_object_put(l_wgn_text);
+                json_object_put(l_tsd_array);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_wgn, "error", l_wgn_text);
+            json_object_array_add(l_tsd_array, l_wgn);
+            break;
+        }
+        switch( l_tsd->type){
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                uint16_t l_flags = 0;
+                _dap_tsd_get_scalar(l_tsd, &l_flags);
+                json_object *l_jobj_tsd_flag = dap_chain_datum_token_flags_to_json(l_flags);
+                if (!l_jobj_tsd_flag) {
+                    json_object_put(l_jobj_tsd_type);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "flags", l_jobj_tsd_flag);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                uint16_t l_flags = 0;
+                _dap_tsd_get_scalar(l_tsd, &l_flags);
+                json_object *l_jobj_tsd_flag = dap_chain_datum_token_flags_to_json(l_flags);
+                if (!l_jobj_tsd_flag) {
+                    json_object_put(l_jobj_tsd_type);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "flags", l_jobj_tsd_flag);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: { // 256
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                uint256_t l_balance_native = uint256_0;
+                _dap_tsd_get_scalar(l_tsd, &l_balance_native);
+                char *l_balance = dap_chain_balance_print(l_balance_native);
+                if (!l_balance) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_jobj_tsd_type);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_value = json_object_new_string(l_balance);
+                DAP_DELETE(l_balance);
+                if (!l_jobj_tsd_value) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_jobj_tsd_type);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "value", l_jobj_tsd_value);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_OLD: {// 128
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_OLD");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                uint128_t l_balance_native_old = uint128_0;
+                _dap_tsd_get_scalar(l_tsd, &l_balance_native_old);
+                char *l_balance = dap_chain_balance_print(GET_256_FROM_128(l_balance_native_old));
+                if (!l_balance) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_jobj_tsd_type);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_value = json_object_new_string(l_balance);
+                DAP_DELETE(l_balance);
+                if (!l_jobj_tsd_value) {
+                    json_object_put(l_jobj_tsd_type);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "value", l_jobj_tsd_value);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID");
+                uint16_t l_flags = 0;
+                _dap_tsd_get_scalar(l_tsd, &l_flags);
+                json_object *l_jobj_value = json_object_new_uint64(l_flags);
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "total_signs_valid", l_jobj_value);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_ADD");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                if (l_tsd->size >= sizeof(dap_pkey_t)) {
+                    dap_pkey_t *l_pkey = (dap_pkey_t *) l_tsd->data;
+                    dap_hash_fast_t l_hf = {0};
+                    if (!dap_pkey_get_hash(l_pkey, &l_hf)) {
+                        json_object *l_wgn_text = json_object_new_string("total_pkeys_add: <WRONG CALCULATION FINGERPRINT>");
+                        if (!l_wgn_text) {
+                            json_object_put(l_jobj_tsd);
+                            json_object_put(l_tsd_array);
+                            dap_json_rpc_allocation_error;
+                            return NULL;
+                        }
+                        json_object_object_add(l_jobj_tsd, "warning", l_wgn_text);
+                    } else {
+                        char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_hf);
+                        if (!l_hash_str) {
+                            json_object_put(l_jobj_tsd);
+                            json_object_put(l_tsd_array);
+                            dap_json_rpc_allocation_error;
+                            return NULL;
+                        }
+                        json_object *l_jobj_hash = json_object_new_string(l_hash_str);
+                        DAP_DELETE(l_hash_str);
+                        if (l_jobj_hash) {
+                            json_object_put(l_jobj_tsd);
+                            json_object_put(l_tsd_array);
+                            dap_json_rpc_allocation_error;
+                            return NULL;
+                        }
+                        json_object_object_add(l_jobj_tsd, "pkey", l_jobj_hash);
+                    }
+                } else {
+                    char *l_wgn_text = dap_strdup_printf("total_pkeys_add: <WRONG SIZE %u>\n", l_tsd->size);
+                    if (!l_wgn_text) {
+                        json_object_put(l_jobj_tsd);
+                        json_object_put(l_tsd_array);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object *l_jobj_wgn_text = json_object_new_string(l_wgn_text);
+                    DAP_DELETE(l_wgn_text);
+                    if (!l_jobj_wgn_text) {
+                        json_object_put(l_jobj_tsd);
+                        json_object_put(l_tsd_array);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn_text);
+                }
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd){
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_REMOVE");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                if (l_tsd->size == sizeof(dap_chain_hash_fast_t)) {
+                    char *l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t *) l_tsd->data);
+                    if (!l_hash_str) {
+                        json_object_put(l_jobj_tsd);
+                        json_object_put(l_tsd_array);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object *l_jobj_hash = json_object_new_string(l_hash_str);
+                    DAP_DELETE(l_hash_str);
+                    if (!l_jobj_hash) {
+                        json_object_put(l_jobj_tsd);
+                        json_object_put(l_tsd_array);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "pkey", l_jobj_hash);
+                } else {
+                    char *l_wgn_text = dap_strdup_printf("total_pkeys_remove: <WRONG SIZE %u>\n", l_tsd->size);
+                    if (!l_wgn_text) {
+                        json_object_put(l_jobj_tsd);
+                        json_object_put(l_tsd_array);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object *l_jobj_wgn_text = json_object_new_string(l_wgn_text);
+                    DAP_DELETE(l_wgn_text);
+                    if (!l_jobj_wgn_text) {
+                        json_object_put(l_jobj_tsd);
+                        json_object_put(l_tsd_array);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn_text);
+                }
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                dap_chain_datum_token_tsd_delegate_from_stake_lock_t *l_tsd_section = _dap_tsd_get_object(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t);
+                json_object *l_jobj_ticker_token_from = json_object_new_string((char*)l_tsd_section->ticker_token_from);
+                char *balance = dap_chain_balance_to_coins(l_tsd_section->emission_rate);
+                if (!l_jobj_ticker_token_from || !balance) {
+                    json_object_put(l_jobj_ticker_token_from);
+                    DAP_DEL_Z(balance);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "ticker_token_from", l_jobj_ticker_token_from);
+                json_object *l_jobj_emission_rate = json_object_new_string(balance);
+                DAP_DEL_Z(balance);
+                if (!l_jobj_emission_rate) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "emission_rate", l_jobj_emission_rate);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                if (!l_jobj_tsd) {
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD");
+                if (!l_jobj_tsd_type) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object *l_jobj_datum_type_allowed_add = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_datum_type_allowed_add) {
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "datum_type_allowed_add", l_jobj_datum_type_allowed_add);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            }continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE");
+                json_object *l_jobj_datum_type_allowed_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_datum_type_allowed_remove) {
+                    json_object_put(l_jobj_datum_type_allowed_remove);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "datum_type_allowed_remove", l_jobj_datum_type_allowed_remove);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            }continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD");
+                json_object *l_jobj_datum_type_blocked_add = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_datum_type_blocked_add) {
+                    json_object_put(l_jobj_datum_type_blocked_add);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "datum_type_blocked_add", l_jobj_datum_type_blocked_add);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE");
+                json_object *l_jobj_datum_type_blocked_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_datum_type_blocked_remove) {
+                    json_object_put(l_jobj_datum_type_blocked_remove);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "datum_type_blocked_remove", l_jobj_datum_type_blocked_remove);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD");
+                json_object *l_jobj_tx_sender_allowed_add = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_allowed_add) {
+                    json_object_put(l_jobj_tx_sender_allowed_add);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_sender_allowed_add",l_jobj_tx_sender_allowed_add);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE");
+                json_object *l_jobj_tx_sender_allowed_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_allowed_remove) {
+                    json_object_put(l_jobj_tx_sender_allowed_remove);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_sender_allowed_remove",l_jobj_tx_sender_allowed_remove);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            }continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD");
+                json_object *l_jobj_tx_sender_blocked_add = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_blocked_add) {
+                    json_object_put(l_jobj_tx_sender_blocked_add);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_sender_blocked_add", l_jobj_tx_sender_blocked_add);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE");
+                json_object *l_jobj_tx_sender_blocked_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_blocked_remove) {
+                    json_object_put(l_jobj_tx_sender_blocked_remove);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_sender_blocked_remove", l_jobj_tx_sender_blocked_remove);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD");
+                json_object *l_tx_receiver_allowed_add = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_tx_receiver_allowed_add) {
+                    json_object_put(l_tx_receiver_allowed_add);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_receiver_allowed_add", l_tx_receiver_allowed_add);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE");
+                json_object *l_jobj_tx_receiver_allowed_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_receiver_allowed_remove){
+                    json_object_put(l_jobj_tx_receiver_allowed_remove);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_receiver_allowed_remove", l_jobj_tx_receiver_allowed_remove);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD");
+                json_object *l_jobj_tx_receiver_blocked_add = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_receiver_blocked_add){
+                    json_object_put(l_jobj_tx_receiver_blocked_add);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_receiver_blocked_add", l_jobj_tx_receiver_blocked_add);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE: {
+                json_object *l_jobj_tsd = json_object_new_object();
+                json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE");
+                json_object *l_jobj_tx_receiver_blocked_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd));
+                if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_receiver_blocked_remove) {
+                    json_object_put(l_jobj_tx_receiver_blocked_remove);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type);
+                json_object_object_add(l_jobj_tsd, "tx_receiver_blocked_remove", l_jobj_tx_receiver_blocked_remove);
+                json_object_array_add(l_tsd_array, l_jobj_tsd);
+            } continue;
+            default: {
+                char *l_wgn_text = dap_strdup_printf("<0x%04hX>: <size %u>\n", l_tsd->type, l_tsd->size);
+                if (!l_wgn_text){
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_wgn_text = json_object_new_string(l_wgn_text);
+                DAP_DELETE(l_wgn_text);
+                json_object *l_jobj_warning = json_object_new_object();
+                if (!l_jobj_wgn_text || !l_jobj_warning) {
+                    json_object_put(l_jobj_wgn_text);
+                    json_object_put(l_jobj_warning);
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_tsd_array);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_warning, "warning", l_jobj_wgn_text);
+                json_object_array_add(l_tsd_array, l_jobj_warning);
+            }
+        }
+    }
+    return l_tsd_array;
+}
+
+typedef enum dap_chain_datum_to_json_err_list {
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TX_TO_JSON = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECL_TO_JSON,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_DECL,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TSD_SECTION_DECL_TO_JSON,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_EMISSION_TO_JSON,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_EMISSION,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_ANCHOR_TO_JSON,
+    CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECREE_TO_JSON
+}dap_chain_datum_to_json_err_list_t;
+
+json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum){
+    json_object *l_object = json_object_new_object();
+    if (!l_object){
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    char *l_hash_data_str;
+    dap_get_data_hash_str_static(a_datum->data, a_datum->header.data_size, l_hash_data_str);
+    json_object *l_obj_data_hash = json_object_new_string(l_hash_data_str);
+    if (!l_obj_data_hash) {
+        json_object_put(l_object);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_version = json_object_new_int(a_datum->header.version_id);
+    if (!l_obj_version) {
+        json_object_put(l_object);
+        json_object_put(l_obj_data_hash);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_size = json_object_new_int(a_datum->header.data_size);
+    if (!l_obj_size) {
+        json_object_put(l_object);
+        json_object_put(l_obj_data_hash);
+        json_object_put(l_obj_version);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_type = json_object_new_string(dap_chain_datum_type_id_to_str(a_datum->header.type_id));
+    if (!l_obj_type) {
+        json_object_put(l_object);
+        json_object_put(l_obj_data_hash);
+        json_object_put(l_obj_version);
+        json_object_put(l_obj_size);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_data = dap_chain_datum_data_to_json(a_datum);
+
+    json_object_object_add(l_object, "hash", l_obj_data_hash);
+    json_object_object_add(l_object, "data_size", l_obj_size);
+    json_object_object_add(l_object, "version", l_obj_version);
+
+    char l_time_str[32];
+    if (a_datum->header.ts_create) {
+        uint64_t l_ts = a_datum->header.ts_create;
+        dap_ctime_r(&l_ts, l_time_str);                             /* Convert ts to  "Sat May 17 01:17:08 2014\n" */
+        l_time_str[strlen(l_time_str)-1] = '\0';                    /* Remove "\n"*/
+    }
+    json_object *l_obj_ts_created = json_object_new_string(l_time_str);
+    json_object_object_add(l_object, "ts_create", l_obj_ts_created);
+    json_object_object_add(l_object, "type", l_obj_type);
+    if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
+        json_object_object_add(l_object, "items", l_obj_data);
+    } else {
+        json_object_object_add(l_object, "data", l_obj_data);
+    }
+    return l_object;
+}
+
+json_object * dap_chain_datum_data_to_json(dap_chain_datum_t *a_datum) {
+    if (!a_datum)
+        return json_object_new_null();
+    json_object *l_obj_data;
+    switch (a_datum->header.type_id) {
+        case DAP_CHAIN_DATUM_TX:
+            l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data);
+            if (!l_obj_data) {
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TX_TO_JSON,
+                                       "Can't convert DAP_CHAIN_DATUM_TX to JSON");
+                return NULL;
+            }
+            break;
+        case DAP_CHAIN_DATUM_DECREE:
+            l_obj_data = dap_chain_datum_decree_to_json((dap_chain_datum_decree_t*)a_datum->data);
+            if (!l_obj_data) {
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECREE_TO_JSON,
+                                       "Can't convert DAP_CHAIN_DATUM_DECREE to JSON");
+                return NULL;
+            }
+            break;
+        case DAP_CHAIN_DATUM_ANCHOR:
+            l_obj_data = dap_chain_datum_anchor_to_json((dap_chain_datum_anchor_t*)a_datum->data);
+            if (!l_obj_data) {
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_ANCHOR_TO_JSON,
+                                       "Can't convert DAP_CHAIN_DATUM_ANCHOR to JSON");
+                return NULL;
+            }
+            break;
+        case DAP_CHAIN_DATUM_TOKEN_DECL: {
+            size_t l_token_size = a_datum->header.data_size;
+            dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(a_datum->data, &l_token_size);
+            if (!l_token) {
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_DECL,
+                                       "The contents of the token delcaration could not be read.");
+                return NULL;
+            }
+            l_obj_data = dap_chain_datum_token_to_json(l_token, l_token_size);
+            if (!l_obj_data) {
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECL_TO_JSON,
+                                       "Can't convert DAP_CHAIN_DATUM_TOKEN_DECL to JSON");
+                DAP_DELETE(l_token);
+                return NULL;
+            }
+            json_object *l_obj_tsd_data = s_dap_chain_datum_token_tsd_to_json(l_token, l_token_size);
+            if (!l_obj_tsd_data) {
+                json_object_put(l_obj_data);
+                DAP_DELETE(l_token);
+                log_it(L_ERROR, "It was not possible to read the contents of the TSD sections of the token delcaration.");
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TSD_SECTION_DECL_TO_JSON,
+                                       "It was not possible to read the contents of the TSD sections of the token delcaration.");
+                return NULL;
+            }
+            json_object_object_add(l_obj_data, "TSD", l_obj_tsd_data);
+            DAP_DELETE(l_token);
+        } break;
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
+            size_t l_emission_size = a_datum->header.data_size;
+            dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_datum->data, &l_emission_size);
+            if (l_emission_size == 0 || !l_emission) {
+                log_it(L_ERROR, "Failed to read emission");
+                dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_EMISSION,
+                                       "Failed to read emission.");
+                return NULL;
+            } else {
+                l_obj_data = dap_chain_datum_emission_to_json(l_emission, l_emission_size);
+                DAP_DELETE(l_emission);
+                if (!l_obj_data) {
+                    dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_EMISSION_TO_JSON,
+                                           "Can't convert DAP_CHAIN_DATUM_TOKEN_DECL to JSON");
+                    return NULL;
+                }
+            }
+        } break;
+        default:
+            l_obj_data = json_object_new_null();
+            break;
+    }
+    return l_obj_data;
+}
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_anchor.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_anchor.c
new file mode 100644
index 0000000000000000000000000000000000000000..2147a1d93718c77e3bfa2209fd22249024fbdbbf
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_anchor.c
@@ -0,0 +1,171 @@
+#include "dap_json_rpc_chain_datum_anchor.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_datum_anchor"
+
+
+json_object *s_dap_chain_datum_anchor_sign_to_json(byte_t * a_signs, size_t a_certs_size) {
+    json_object *l_jobs_signs = json_object_new_array();
+    size_t l_offset = 0;
+    for (int i = 1; l_offset < (a_certs_size); i++) {
+        json_object *l_jobj_sign = json_object_new_object();
+        dap_sign_t *l_sign = (dap_sign_t*)(a_signs + l_offset);
+        l_offset += dap_sign_get_size(l_sign);
+        if (l_sign->header.sign_size == 0) {
+            json_object *l_wrn_text = json_object_new_string("<CORRUPTED - 0 size signature>");
+            json_object_object_add(l_jobj_sign, "warning", l_wrn_text);
+            continue;
+        }
+
+        dap_chain_hash_fast_t l_pkey_hash = {0};
+        if (dap_sign_get_pkey_hash(l_sign, &l_pkey_hash) == false) {
+            json_object *l_wrn_text = json_object_new_string("<CORRUPTED - can't calc hash>");
+            json_object_object_add(l_jobj_sign, "warning", l_wrn_text);
+            continue;
+        }
+        char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash);
+        json_object *l_jobj_hash_str = json_object_new_string(l_hash_str);
+        json_object *l_jobj_type_str = json_object_new_string(dap_sign_type_to_str(l_sign->header.type));
+        json_object *l_jobj_sign_size = json_object_new_uint64(l_sign->header.sign_size);
+        json_object_object_add(l_jobj_sign, "hash", l_jobj_hash_str);
+        json_object_object_add(l_jobj_sign, "type", l_jobj_type_str);
+        json_object_object_add(l_jobj_sign, "size", l_jobj_sign_size);
+        DAP_DEL_Z(l_hash_str);
+        json_object_array_add(l_jobs_signs, l_jobj_sign);
+    }
+    return l_jobs_signs;
+}
+
+json_object *dap_chain_datum_anchor_to_json(dap_chain_datum_anchor_t *a_anchor){
+    json_object *l_obj_anchor = json_object_new_object();
+    if (!l_obj_anchor) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_version = json_object_new_uint64(a_anchor->anchor_version);
+    if (!l_obj_version){
+        json_object_put(l_obj_anchor);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_ts_created = json_object_new_uint64(a_anchor->header.ts_created);
+    if (!l_obj_ts_created) {
+        json_object_put(l_obj_version);
+        json_object_put(l_obj_anchor);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_tsd_array = json_object_new_array();
+    if(!l_obj_tsd_array) {
+        json_object_put(l_obj_ts_created);
+        json_object_put(l_obj_version);
+        json_object_put(l_obj_anchor);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    size_t l_tsd_offset = 0, tsd_data_size = a_anchor->header.data_size;
+
+    while(l_tsd_offset < tsd_data_size){
+        json_object *l_jobj_tsd = json_object_new_object();
+        if (!l_jobj_tsd) {
+            json_object_put(l_obj_tsd_array);
+            json_object_put(l_obj_ts_created);
+            json_object_put(l_obj_version);
+            json_object_put(l_obj_anchor);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        dap_tsd_t *l_tsd = (dap_tsd_t*)a_anchor->data_n_sign + l_tsd_offset;
+        size_t l_tsd_size = l_tsd->size + sizeof(dap_tsd_t);
+        if(l_tsd_size > tsd_data_size){
+            json_object *l_jobj_wgn = json_object_new_string("TSD size is greater than all data size. It's possible corrupt data.");
+            if (!l_jobj_wgn){
+                json_object_put(l_jobj_tsd);
+                json_object_put(l_obj_tsd_array);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_version);
+                json_object_put(l_obj_anchor);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn);
+            json_object_array_add(l_obj_tsd_array, l_jobj_tsd);
+            break;
+        }
+        if (l_tsd->type == DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH){
+            json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH");
+            if (!l_obj_tsd_type){
+                json_object_put(l_jobj_tsd);
+                json_object_put(l_obj_tsd_array);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_version);
+                json_object_put(l_obj_anchor);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+            if(l_tsd->size > sizeof(dap_hash_fast_t)){
+                json_object *l_jobj_wgn = json_object_new_string("Wrong fee tsd data size.");
+                if (!l_jobj_wgn){
+                    json_object_put(l_jobj_tsd);
+                    json_object_put(l_obj_tsd_array);
+                    json_object_put(l_obj_ts_created);
+                    json_object_put(l_obj_ts_created);
+                    json_object_put(l_obj_version);
+                    json_object_put(l_obj_anchor);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn);
+                json_object_array_add(l_obj_tsd_array, l_jobj_tsd);
+                break;
+            }
+            dap_hash_fast_t l_out_hash = {0};
+            _dap_tsd_get_scalar(l_tsd, &l_out_hash);
+            char *l_hash_str = dap_hash_fast_to_str_new(&l_out_hash);
+            if (!l_hash_str) {
+                json_object_put(l_jobj_tsd);
+                json_object_put(l_obj_tsd_array);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_version);
+                json_object_put(l_obj_anchor);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object *l_obj_tsd_hash = json_object_new_string(l_hash_str);
+            DAP_DELETE(l_hash_str);
+            if (!l_obj_tsd_hash){
+                json_object_put(l_jobj_tsd);
+                json_object_put(l_obj_tsd_array);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_ts_created);
+                json_object_put(l_obj_version);
+                json_object_put(l_obj_anchor);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_jobj_tsd, "hash", l_obj_tsd_hash);
+        }
+        json_object_array_add(l_obj_tsd_array, l_jobj_tsd);
+        l_tsd_offset += l_tsd_size;
+    }
+    json_object_object_add(l_obj_anchor, "version", l_obj_version);
+    json_object_object_add(l_obj_anchor, "ts_created", l_obj_ts_created);
+    json_object_object_add(l_obj_anchor, "TSD", l_obj_tsd_array);
+    json_object *l_jobj_signs = s_dap_chain_datum_anchor_sign_to_json(a_anchor->data_n_sign + a_anchor->header.data_size,
+                                                                      a_anchor->header.signs_size);
+    if (!l_jobj_signs) {
+        json_object_put(l_obj_tsd_array);
+        json_object_put(l_obj_ts_created);
+        json_object_put(l_obj_ts_created);
+        json_object_put(l_obj_version);
+        json_object_put(l_obj_anchor);
+        dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "I can't serialize the anchor signature in JSON.");
+        return NULL;
+    }
+    json_object_object_add(l_obj_anchor, "signs", l_jobj_signs);
+    return l_obj_anchor;
+}
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_decree.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_decree.c
new file mode 100644
index 0000000000000000000000000000000000000000..2fba615b5ef0c5dc789355289bb6a5c62c332120
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_decree.c
@@ -0,0 +1,668 @@
+
+#include "dap_json_rpc_chain_datum_decree.h"
+#include "json.h"
+
+
+#define LOG_TAG "dap_json_rpc_chain_datum_decree"
+
+json_object *s_dap_chain_datum_decree_certs_dump_json(byte_t * a_signs, size_t a_certs_size){
+    json_object *l_jobj_signatures = json_object_new_array();
+    if (!l_jobj_signatures) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    size_t l_offset = 0;
+    for (int i = 1; l_offset < (a_certs_size); i++) {
+        json_object *l_jobj_signature = json_object_new_object();
+        if (!l_jobj_signature) {
+            json_object_put(l_jobj_signatures);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        dap_sign_t *l_sign = (dap_sign_t *) (a_signs + l_offset);
+        l_offset += dap_sign_get_size(l_sign);
+        if (l_sign->header.sign_size == 0) {
+            json_object *l_wrn_text = json_object_new_string("<CORRUPTED - 0 size signature>");
+            if(!l_wrn_text) {
+                json_object_put(l_jobj_signature);
+                json_object_put(l_jobj_signatures);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_jobj_signature, "warning", l_wrn_text);
+            continue;
+        }
+
+        dap_chain_hash_fast_t l_pkey_hash = {0};
+        if (dap_sign_get_pkey_hash(l_sign, &l_pkey_hash) == false) {
+            json_object *l_wrn_text = json_object_new_string("<CORRUPTED - can't calc hash>");
+            if (!l_wrn_text){
+                json_object_put(l_jobj_signature);
+                json_object_put(l_jobj_signatures);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_jobj_signature, "warning", l_wrn_text);
+            continue;
+        }
+
+        char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash);
+        if (!l_hash_str) {
+            json_object_put(l_jobj_signature);
+            json_object_put(l_jobj_signatures);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_jobj_hash_str = json_object_new_string(l_hash_str);
+        if (!l_jobj_hash_str) {
+            DAP_DEL_Z(l_hash_str);
+            json_object_put(l_jobj_signature);
+            json_object_put(l_jobj_signatures);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_jobj_type_str = json_object_new_string(dap_sign_type_to_str(l_sign->header.type));
+        if (!l_jobj_type_str) {
+            json_object_put(l_jobj_hash_str);
+            json_object_put(l_jobj_signature);
+            json_object_put(l_jobj_signatures);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_jobj_sign_size = json_object_new_uint64(l_sign->header.sign_size);
+        if (!l_jobj_sign_size) {
+            json_object_put(l_jobj_hash_str);
+            json_object_put(l_jobj_type_str);
+            json_object_put(l_jobj_signature);
+            json_object_put(l_jobj_signatures);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        DAP_DEL_Z(l_hash_str);
+        json_object_object_add(l_jobj_signature, "hash", l_jobj_hash_str);
+        json_object_object_add(l_jobj_signature, "type", l_jobj_type_str);
+        json_object_object_add(l_jobj_signature, "size", l_jobj_sign_size);
+        json_object_array_add(l_jobj_signatures, l_jobj_signature);
+    }
+    return l_jobj_signatures;
+}
+
+json_object *dap_chain_datum_decree_to_json(dap_chain_datum_decree_t *a_decree){
+    json_object *l_jobj_decree = json_object_new_object();
+    if (!l_jobj_decree) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    char *l_type_str = "";
+    switch(a_decree->header.type)
+    {
+        case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON:
+            l_type_str = "DECREE_TYPE_COMMON";
+            break;
+        case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE:
+            l_type_str = "DECREE_TYPE_SERVICE";
+            break;
+        default:
+            l_type_str = "DECREE_TYPE_UNKNOWN";
+    }
+    json_object *l_jobj_type = json_object_new_string(l_type_str);
+    if (!l_jobj_type) {
+        json_object_put(l_jobj_decree);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    const char *l_subtype_str = dap_chain_datum_decree_subtype_to_str(a_decree->header.sub_type);
+    json_object *l_json_subtype = json_object_new_string(l_subtype_str);
+    if (!l_json_subtype) {
+        json_object_put(l_jobj_type);
+        json_object_put(l_jobj_decree);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_json_tsd_array = json_object_new_array();
+    if (!l_json_tsd_array){
+        json_object_put(l_json_subtype);
+        json_object_put(l_jobj_type);
+        json_object_put(l_jobj_decree);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    for (size_t l_offset = 0; l_offset < a_decree->header.data_size;) {
+        dap_tsd_t *l_tsd = (dap_tsd_t *)((byte_t*)a_decree->data_n_signs + l_offset);
+        l_offset += dap_tsd_size(l_tsd);
+        json_object *l_jobj_tsd = json_object_new_object();
+        if (!l_jobj_tsd) {
+            json_object_put(l_json_tsd_array);
+            json_object_put(l_json_subtype);
+            json_object_put(l_jobj_type);
+            json_object_put(l_jobj_decree);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        switch(l_tsd->type) {
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN");
+                if (!l_obj_tsd_type) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE");
+                if (!l_obj_tsd_type) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(uint256_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Fee: <WRONG SIZE>");
+                    if (!l_text_wgn) {
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                uint256_t l_fee_value = uint256_0;
+                _dap_tsd_get_scalar(l_tsd, &l_fee_value);
+                char *l_fee_value_str = dap_chain_balance_print(l_fee_value);
+                if (!l_fee_value_str) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_fee = json_object_new_string(l_fee_value_str);
+                DAP_DELETE(l_fee_value_str);
+                if (!l_jobj_fee) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "value", l_jobj_fee);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER");
+                if (!l_obj_tsd_type){
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size < sizeof(dap_pkey_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Owner fingerprint: <WRONG SIZE>");
+                    if (!l_text_wgn){
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                dap_pkey_t *l_owner_pkey = DAP_NEW_Z_SIZE(dap_pkey_t, l_tsd->size);
+                if(!l_owner_pkey) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                memcpy(l_owner_pkey, l_tsd->data, l_tsd->size);
+                dap_hash_fast_t l_owner_pkey_hash = {0};
+                dap_hash_fast(l_owner_pkey->pkey, l_owner_pkey->header.size, &l_owner_pkey_hash);
+                char l_owner_pkey_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
+                dap_chain_hash_fast_to_str(&l_owner_pkey_hash, l_owner_pkey_str, sizeof(l_owner_pkey_str));
+                json_object *l_jobj_owner_pkey = json_object_new_string(l_owner_pkey_str);
+                if (!l_jobj_owner_pkey) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "owner_fingerprint", l_jobj_owner_pkey);
+                DAP_DELETE(l_owner_pkey);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER");
+                if (!l_obj_tsd_type){
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(uint256_t)){
+                    json_object *l_text_wgn = json_object_new_string("Owner min: <WRONG SIZE>");
+                    if (!l_text_wgn) {
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                uint256_t l_owner_min = {0};
+                _dap_tsd_get_scalar(l_tsd, &l_owner_min);
+                char *l_owner_min_str = dap_chain_balance_print(l_owner_min);
+                if (!l_owner_min_str) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_owner_min = json_object_new_string(l_owner_min_str);
+                if (!l_jobj_owner_min) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "owner_min", l_jobj_owner_min);
+                DAP_DELETE(l_owner_min_str);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET");
+                if (!l_obj_tsd_type) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(dap_chain_addr_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Wallet for fee: <WRONG SIZE>");
+                    if (!l_text_wgn) {
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                dap_chain_addr_t l_addr_fee_wallet = {0};
+                _dap_tsd_get_scalar(l_tsd, &l_addr_fee_wallet);
+                char *l_addr_fee_wallet_str = dap_chain_addr_to_str(&l_addr_fee_wallet);
+                if (!l_addr_fee_wallet_str) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_ADDR_TO_JSON,
+                                           "Failed to serialize address to JSON.");
+                    return NULL;
+                }
+                json_object *l_jobj_addr_fee_wallet = json_object_new_string(l_addr_fee_wallet_str);
+                DAP_DELETE(l_addr_fee_wallet_str);
+                if (!l_jobj_addr_fee_wallet) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "addr", l_jobj_addr_fee_wallet);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_TX_HASH: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_TX_HASH");
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(dap_hash_fast_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Stake tx: <WRONG SIZE>");
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                dap_hash_fast_t l_stake_tx = {0};
+                _dap_tsd_get_scalar(l_tsd, &l_stake_tx);
+                char *l_stake_tx_hash = dap_chain_hash_fast_to_str_new(&l_stake_tx);
+                if (!l_stake_tx_hash) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_tx_hash = json_object_new_string(l_stake_tx_hash);
+                DAP_DELETE(l_stake_tx_hash);
+                if (!l_jobj_tx_hash) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "hash", l_jobj_tx_hash);
+//                char *l_stake_tx_hash = dap_strcmp(a_hash_out_type, "hex")
+//                                        ? dap_enc_base58_encode_hash_to_str(&l_stake_tx)
+//                                        : dap_chain_hash_fast_to_str_new(&l_stake_tx);
+//                dap_string_append_printf(a_str_out, "\tStake tx: %s\n", l_stake_tx_hash);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE");
+                if (!l_obj_tsd_type){
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(uint256_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Stake value: <WRONG SIZE>");
+                    if (!l_text_wgn){
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                uint256_t l_stake_value = uint256_0;
+                _dap_tsd_get_scalar(l_tsd, &l_stake_value);
+                char *l_stake_value_str = dap_chain_balance_print(l_stake_value);
+                if (!l_stake_value_str) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_stake_value = json_object_new_string(l_stake_value_str);
+                DAP_DELETE(l_stake_value_str);
+                if (!l_jobj_stake_value){
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "value", l_jobj_stake_value);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR: {
+                json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR");
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(dap_chain_addr_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Signing addr: <WRONG SIZE>");
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                dap_chain_addr_t l_stake_addr_signing = {0};
+                _dap_tsd_get_scalar(l_tsd, &l_stake_addr_signing);
+                char *l_stake_addr_signing_str = dap_chain_addr_to_str(&l_stake_addr_signing);
+//                dap_string_append_printf(a_str_out, "\tSigning addr: %s\n", l_stake_addr_signing_str);
+                dap_chain_hash_fast_t *l_pkey_signing = DAP_NEW(dap_chain_hash_fast_t);
+                if (!l_pkey_signing) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                memcpy(l_pkey_signing, l_stake_addr_signing.data.key, sizeof(dap_chain_hash_fast_t));
+                char *l_pkey_signing_str = dap_chain_hash_fast_to_str_new(l_pkey_signing);
+                if (!l_pkey_signing_str){
+                    DAP_DELETE(l_pkey_signing);
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_stake_addr_signing = json_object_new_string(l_stake_addr_signing_str);
+                if (!l_jobj_stake_addr_signing) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_pkey_signing = json_object_new_string(l_pkey_signing_str);
+                if (!l_jobj_pkey_signing) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "addr", l_jobj_stake_addr_signing);
+                json_object_object_add(l_jobj_tsd, "pkey", l_jobj_pkey_signing);
+//                char *l_pkey_signing_str = dap_strcmp(a_hash_out_type, "hex")
+//                                           ? dap_enc_base58_encode_hash_to_str(l_pkey_signing)
+//                                           : dap_chain_hash_fast_to_str_new(l_pkey_signing);
+//                dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str);
+                DAP_DELETE(l_stake_addr_signing_str);
+                DAP_DELETE(l_pkey_signing_str);
+                DAP_DELETE(l_pkey_signing);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNER_NODE_ADDR: {
+                json_object *l_obj_tsd_type = json_object_new_string(
+                        "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNER_NODE_ADDR");
+                if (!l_obj_tsd_type) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if(l_tsd->size > sizeof(dap_chain_node_addr_t)){
+                    json_object *l_text_wgn = json_object_new_string("Node addr: <WRONG SIZE>");
+                    if (!l_text_wgn){
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                dap_chain_node_addr_t l_node_addr = {0};
+                _dap_tsd_get_scalar(l_tsd, &l_node_addr);
+                char *l_node_addr_str = dap_strdup_printf(NODE_ADDR_FP_STR,NODE_ADDR_FP_ARGS_S(l_node_addr));
+                if (!l_node_addr_str) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_node_addr = json_object_new_string(l_node_addr_str);
+                DAP_DELETE(l_node_addr_str);
+                if (!l_jobj_node_addr){
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "node", l_jobj_node_addr);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE: {
+                json_object *l_obj_tsd_type = json_object_new_string(
+                        "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE");
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(uint256_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Min value: <WRONG SIZE>");
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                uint256_t l_min_value = uint256_0;
+                _dap_tsd_get_scalar(l_tsd, &l_min_value);
+                char *l_min_value_str = dap_chain_balance_print(l_min_value);
+                json_object *l_jobj_min_value = json_object_new_string(l_min_value_str);
+                json_object_object_add(l_jobj_tsd, "value", l_jobj_min_value);
+                DAP_DELETE(l_min_value_str);
+            } break;
+            case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT: {
+                json_object *l_obj_tsd_type = json_object_new_string(
+                        "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT");
+                if (!l_obj_tsd_type) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+                if (l_tsd->size > sizeof(uint256_t)) {
+                    json_object *l_text_wgn = json_object_new_string("Min signers count: <WRONG SIZE>");
+                    if(!l_text_wgn){
+                        json_object_put(l_json_tsd_array);
+                        json_object_put(l_json_subtype);
+                        json_object_put(l_jobj_type);
+                        json_object_put(l_jobj_decree);
+                        json_object_put(l_jobj_tsd);
+                        dap_json_rpc_allocation_error;
+                        return NULL;
+                    }
+                    json_object_object_add(l_jobj_tsd, "warning", l_text_wgn);
+                    break;
+                }
+                uint256_t l_min_signers_count = uint256_0;
+                _dap_tsd_get_scalar(l_tsd, &l_min_signers_count);
+                char *l_min_signers_count_str = dap_chain_balance_print(l_min_signers_count);
+                if (!l_min_signers_count_str) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_jobj_min_signers_count = json_object_new_string(l_min_signers_count_str);
+                if (!l_jobj_min_signers_count) {
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                DAP_DELETE(l_min_signers_count_str);
+                json_object_object_add(l_jobj_tsd, "count", l_jobj_min_signers_count);
+            } break;
+            default: {
+                json_object *l_obj_tsd_type = json_object_new_string(
+                        "<UNKNOWN_TYPE_TSD_SECTION>");
+                if (!l_obj_tsd_type){
+                    json_object_put(l_json_tsd_array);
+                    json_object_put(l_json_subtype);
+                    json_object_put(l_jobj_type);
+                    json_object_put(l_jobj_decree);
+                    json_object_put(l_jobj_tsd);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type);
+            } break;
+        }
+        json_object_array_add(l_json_tsd_array, l_jobj_tsd);
+    }
+    json_object *l_jobj_signs = s_dap_chain_datum_decree_certs_dump_json(a_decree->data_n_signs + a_decree->header.data_size,
+                                                                         a_decree->header.signs_size);
+    if (!l_jobj_signs){
+        json_object_put(l_json_tsd_array);
+        json_object_put(l_json_subtype);
+        json_object_put(l_jobj_type);
+        json_object_put(l_jobj_decree);
+        dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "Can't serialize the decree signature in JSON.");
+        return NULL;
+    }
+    json_object_object_add(l_jobj_decree, "type", l_jobj_type);
+    json_object_object_add(l_jobj_decree, "subtype", l_json_subtype);
+    json_object_object_add(l_jobj_decree, "TSD", l_json_tsd_array);
+    json_object_object_add(l_jobj_decree, "signs", l_jobj_signs);
+    return l_jobj_decree;
+}
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c
new file mode 100644
index 0000000000000000000000000000000000000000..4178f41b2ac58e470d4b416ce63f7fcf63b575a4
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c
@@ -0,0 +1,388 @@
+
+
+#include "dap_json_rpc_chain_datum_token.h"
+#include "dap_json_rpc_chain_common.h"
+#include "dap_json_rpc_sign.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_datum_token"
+
+json_object *dap_chain_datum_token_flags_to_json(uint16_t a_flags){
+    if (!a_flags) {
+        return json_object_new_null();
+    }
+    json_object *l_jobj_flags = json_object_new_array();
+    for (uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){
+        if(a_flags & (1 << i)){
+            json_object *l_jobj_flag_txt = json_object_new_string(c_dap_chain_datum_token_flag_str[BIT(i)]);
+            json_object_array_add(l_jobj_flags, l_jobj_flag_txt);
+        }
+    }
+    return l_jobj_flags;
+}
+
+
+json_object *dap_chain_datum_token_to_json(dap_chain_datum_token_t * a_token, size_t a_token_size){
+    json_object *l_jobj_token = json_object_new_object();
+    if (!l_jobj_token){
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_jobj_type;
+    json_object *l_jobj_version = json_object_new_uint64(a_token->version);
+    if (!l_jobj_version) {
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    switch (a_token->type) {
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL:
+            l_jobj_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TYPE_DECL");
+            break;
+        case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE:
+            l_jobj_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE");
+            break;
+        default:
+            l_jobj_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TYPE_UNKNOWN");
+            break;
+    }
+    if (!l_jobj_type) {
+        json_object_put(l_jobj_version);
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_jobj_token, "version", l_jobj_version);
+    json_object_object_add(l_jobj_token, "type", l_jobj_type);
+    json_object *l_jobj_subtype = NULL;
+    json_object *l_jobj_header = json_object_new_object();
+    if (!l_jobj_header){
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    size_t l_tsd_total_size = 0;
+    switch (a_token->subtype) {
+        case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: {
+            json_object *l_jobj_decimals  = json_object_new_uint64(a_token->header_simple.decimals);
+            if (!l_jobj_decimals){
+                json_object_put(l_jobj_header);
+                json_object_put(l_jobj_token);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_jobj_header, "decimals", l_jobj_decimals);
+            l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE");
+        }break;
+        case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: {
+            json_object *l_jobj_flags = NULL;
+            json_object *l_jobj_decimals  = NULL;
+            if (a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_DECL) {
+                l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_private_decl.flags));
+                if (!l_jobj_flags){
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_jobj_decimals = json_object_new_uint64(a_token->header_private_decl.decimals);
+                if (!l_jobj_decimals) {
+                    json_object_put(l_jobj_flags);
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_tsd_total_size = a_token->header_private_decl.tsd_total_size;
+            } else {
+                l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_private_update.flags));
+                if (!l_jobj_flags) {
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_jobj_decimals = json_object_new_uint64(a_token->header_private_update.decimals);
+                if (!l_jobj_decimals) {
+                    json_object_put(l_jobj_flags);
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_tsd_total_size = a_token->header_private_update.tsd_total_size;
+            }
+            json_object_object_add(l_jobj_header, "flags", l_jobj_flags);
+            json_object_object_add(l_jobj_header, "decimals", l_jobj_decimals);
+            l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE");
+        } break;
+        case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: {
+            json_object *l_jobj_flags = NULL;
+            json_object *l_jobj_decimals  = NULL;
+            if (a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_DECL) {
+                l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_native_decl.flags));
+                if (!l_jobj_flags) {
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_jobj_decimals = json_object_new_uint64(a_token->header_native_decl.decimals);
+                if (!l_jobj_decimals){
+                    json_object_put(l_jobj_flags);
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_tsd_total_size = a_token->header_native_decl.tsd_total_size;
+            } else {
+                l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_native_update.flags));
+                if (!l_jobj_flags) {
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_jobj_decimals = json_object_new_uint64(a_token->header_native_update.decimals);
+                if (!l_jobj_decimals) {
+                    json_object_put(l_jobj_flags);
+                    json_object_put(l_jobj_header);
+                    json_object_put(l_jobj_token);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                l_tsd_total_size = a_token->header_native_update.tsd_total_size;
+            }
+            json_object_object_add(l_jobj_header, "flags", l_jobj_flags);
+            json_object_object_add(l_jobj_header, "decimals", l_jobj_decimals);
+            l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE");
+        } break;
+        case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC: {
+            json_object *l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_public.flags));
+            if (!l_jobj_flags){
+                json_object_put(l_jobj_header);
+                json_object_put(l_jobj_token);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            char *l_premine_supply_str = dap_chain_balance_print(a_token->header_public.premine_supply);
+            if (!l_premine_supply_str) {
+                json_object_put(l_jobj_flags);
+                json_object_put(l_jobj_header);
+                json_object_put(l_jobj_token);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object *l_jobj_premine_supply = json_object_new_string(l_premine_supply_str);
+            DAP_DELETE(l_premine_supply_str);
+            if (!l_jobj_premine_supply) {
+                json_object_put(l_jobj_flags);
+                json_object_put(l_jobj_header);
+                json_object_put(l_jobj_token);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object *l_jobj_premine_address = dap_chain_addr_to_json(&a_token->header_public.premine_address);
+            if (!l_jobj_premine_address) {
+                json_object_put(l_jobj_flags);
+                json_object_put(l_jobj_premine_supply);
+                json_object_put(l_jobj_header);
+                json_object_put(l_jobj_token);
+                dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_ADDR_TO_JSON,
+                                       "Failed to convert address to JSON.");
+                return NULL;
+            }
+            json_object_object_add(l_jobj_header, "flags", l_jobj_flags);
+            json_object_object_add(l_jobj_header, "premine_supply", l_jobj_premine_supply);
+            json_object_object_add(l_jobj_header, "premine_address", l_jobj_premine_address);
+            l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC");
+        } break;
+        default: {
+            l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_UNKNOWN");
+        } break;
+    }
+    if (!l_jobj_subtype) {
+        json_object_put(l_jobj_header);
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_jobj_token, "subtype", l_jobj_subtype);
+    json_object_object_add(l_jobj_token, "header", l_jobj_header);
+    json_object *l_jobj_ticker = json_object_new_string(a_token->ticker);
+    if (!l_jobj_ticker) {
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_jobj_token, "ticker", l_jobj_ticker);
+    json_object *l_jobj_signs_valid = json_object_new_uint64(a_token->signs_valid);
+    if (!l_jobj_signs_valid) {
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_jobj_token, "signs_valid", l_jobj_signs_valid);
+    json_object *l_jobj_signs_total = json_object_new_uint64(a_token->signs_total);
+    if (!l_jobj_signs_total) {
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_jobj_token, "signs_total", l_jobj_signs_total);
+    json_object *l_obj_signs = json_object_new_array();
+    if (!l_obj_signs) {
+        json_object_put(l_jobj_token);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    size_t l_offset = 0;
+    size_t l_certs_field_size = a_token_size - sizeof(*a_token);
+    while (l_offset < l_certs_field_size) {
+        dap_sign_t *l_sign = (dap_sign_t *) ((byte_t*)a_token->data_n_tsd + l_tsd_total_size + l_offset);
+        l_offset += dap_sign_get_size(l_sign);
+        json_object *l_obj_sign = dap_sign_to_json(l_sign);
+        if (!l_obj_sign) {
+            json_object_put(l_obj_signs);
+            json_object_put(l_jobj_token);
+            dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "Failed to convert signature to JSON.");
+            return NULL;
+        }
+        json_object_array_add(l_obj_signs, l_obj_sign);
+    }
+    json_object_object_add(l_jobj_token, "signs", l_obj_signs);
+    return l_jobj_token;
+}
+
+
+json_object *dap_chain_datum_emission_to_json(dap_chain_datum_token_emission_t *a_emission, size_t a_emission_size){
+    json_object *l_emi_obj = json_object_new_object();
+    json_object *l_emi_version = json_object_new_uint64(a_emission->hdr.version);
+    json_object *l_emi_type = json_object_new_string(c_dap_chain_datum_token_emission_type_str[a_emission->hdr.type]);
+    json_object *l_emi_address = dap_chain_addr_to_json(&a_emission->hdr.address);
+    json_object *l_emi_header = json_object_new_object();
+    json_object *l_emi_data = json_object_new_object();
+    if (!l_emi_obj || !l_emi_version || !l_emi_type || !l_emi_address || !l_emi_header || ! l_emi_data) {
+        json_object_put(l_emi_obj);
+        json_object_put(l_emi_version);
+        json_object_put(l_emi_type);
+        json_object_put(l_emi_address);
+        json_object_put(l_emi_header);
+        json_object_put(l_emi_data);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_emi_header, "version", l_emi_version);
+    json_object_object_add(l_emi_header, "type", l_emi_type);
+    json_object_object_add(l_emi_header, "address", l_emi_address);
+    json_object_object_add(l_emi_obj, "header", l_emi_header);
+    switch (a_emission->hdr.type){
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: {
+            json_object *l_obj_size = json_object_new_uint64(a_emission->data.type_auth.size);
+            json_object *l_obj_tsd_total_size = json_object_new_uint64(a_emission->data.type_auth.tsd_total_size);
+            json_object *l_obj_signs_count = json_object_new_uint64(a_emission->data.type_auth.signs_count);
+            if (!l_obj_size || !l_obj_tsd_total_size || !l_obj_signs_count) {
+                json_object_put(l_obj_size);
+                json_object_put(l_obj_tsd_total_size);
+                json_object_put(l_obj_signs_count);
+                json_object_put(l_emi_data);
+                json_object_put(l_emi_obj);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_emi_data, "size", l_obj_size);
+            json_object_object_add(l_emi_data, "tsd_total_size", l_obj_tsd_total_size);
+            json_object_object_add(l_emi_data, "signs_count", l_obj_signs_count);
+            if (((void *) a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size) >
+                  ((void *) a_emission + a_emission_size)) {
+                char *l_err_str = dap_strdup_printf("Malformed DATUM type %d, TSD section is out-of-buffer (%" DAP_UINT64_FORMAT_U " vs %zu)",
+                                                            a_emission->hdr.type, a_emission->data.type_auth.tsd_total_size, a_emission_size);
+                if (!l_err_str){
+                    json_object_put(l_emi_data);
+                    json_object_put(l_emi_obj);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object *l_err_tsd = json_object_new_string(l_err_str);
+                DAP_DELETE(l_err_str);
+                if (!l_err_tsd) {
+                    json_object_put(l_emi_data);
+                    json_object_put(l_emi_obj);
+                    dap_json_rpc_allocation_error;
+                    return NULL;
+                }
+                json_object_object_add(l_emi_data, "ERROR", l_err_tsd);
+            }
+            json_object *l_obj_signs = json_object_new_array();
+            if (!l_obj_signs){
+                json_object_put(l_emi_data);
+                json_object_put(l_emi_obj);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            size_t l_offset = a_emission->data.type_auth.tsd_total_size;
+            for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) {
+                dap_sign_t *l_sign = (dap_sign_t *) ((byte_t*)a_emission->tsd_n_signs + l_offset);
+                l_offset += dap_sign_get_size(l_sign);
+                json_object *l_obj_sign = dap_sign_to_json(l_sign);
+                if (!l_obj_sign) {
+                    json_object_put(l_obj_signs);
+                    json_object_put(l_emi_data);
+                    json_object_put(l_emi_obj);
+                    dap_json_rpc_error_add(3, "Failed to serialize signature to JSON object.");
+                    return NULL;
+                }
+                json_object_array_add(l_obj_signs, l_obj_sign);
+            }
+            json_object_object_add(l_emi_data, "signs", l_obj_signs);
+
+        } break;
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: {
+            json_object *l_code_name = json_object_new_string(a_emission->data.type_algo.codename);
+            if (!l_code_name) {
+                json_object_put(l_emi_data);
+                json_object_put(l_emi_obj);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_emi_data, "codename", l_code_name);
+        } break;
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: {
+            json_object *l_value_start = json_object_new_uint64(a_emission->data.type_atom_owner.value_start);
+            json_object *l_value_change_algo_codename = json_object_new_string(
+                    a_emission->data.type_atom_owner.value_change_algo_codename);
+            if (!l_value_start || !l_value_change_algo_codename) {
+                json_object_put(l_value_start);
+                json_object_put(l_value_change_algo_codename);
+                json_object_put(l_emi_data);
+                json_object_put(l_emi_obj);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_emi_data, "value_start", l_value_start);
+            json_object_object_add(l_emi_data, "value_change_algo_codename", l_value_change_algo_codename);
+        } break;
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT:
+        {
+            json_object *l_obj_addr = dap_chain_addr_to_json(&a_emission->data.type_presale.addr);
+            json_object *l_obj_flags = json_object_new_int64(a_emission->data.type_presale.flags);
+            json_object *l_obj_lock_time = json_object_new_uint64(a_emission->data.type_presale.lock_time);
+            if (!l_obj_addr || !l_obj_flags || !l_obj_lock_time) {
+                json_object_put(l_obj_addr);
+                json_object_put(l_obj_flags);
+                json_object_put(l_obj_lock_time);
+                json_object_put(l_emi_data);
+                json_object_put(l_emi_obj);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_emi_data, "addr", l_obj_addr);
+            json_object_object_add(l_emi_data, "flags", l_obj_flags);
+            json_object_object_add(l_emi_data, "lock_time", l_obj_lock_time);
+        }break;
+    }
+    json_object_object_add(l_emi_obj, "data", l_emi_data);
+    return  l_emi_obj;
+}
+
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c
new file mode 100644
index 0000000000000000000000000000000000000000..0e9ae8475e5bd601bc767d4cf22fcaf721020814
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c
@@ -0,0 +1,134 @@
+#include <memory.h>
+#include <assert.h>
+#include "dap_common.h"
+#include "dap_sign.h"
+#include "dap_chain_datum_tx.h"
+#include "dap_chain_datum_tx_items.h"
+
+#include "dap_json_rpc_chain_datum_tx.h"
+#include "dap_json_rpc_chain_datum_tx_items.h"
+#include "dap_json_rpc_chain_datum_tx_receipt.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_datum_tx"
+
+
+
+json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){
+    json_object *l_obj_items = json_object_new_array();
+    if (!l_obj_items) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    uint32_t l_tx_items_count = 0;
+    uint32_t l_tx_items_size = a_tx->header.tx_items_size;
+    while(l_tx_items_count < l_tx_items_size) {
+        uint8_t *item = a_tx->tx_items + l_tx_items_count;
+        size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item);
+        if (l_tx_item_size == 0) {
+            json_object_put(l_obj_items);
+            l_obj_items = json_object_new_null();
+            break;
+        }
+        dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(item);
+        json_object *l_obj_item_type = NULL, *l_obj_item_data = NULL;
+        switch (l_item_type) {
+            case TX_ITEM_TYPE_IN:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN");
+                l_obj_item_data = dap_chain_datum_tx_item_in_to_json((dap_chain_tx_in_t*)item);
+                break;
+            case TX_ITEM_TYPE_OUT:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT");
+                l_obj_item_data = dap_chain_datum_tx_item_out_to_json((dap_chain_tx_out_t*)item);
+                break;
+            case TX_ITEM_TYPE_IN_EMS:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_EMS");
+                l_obj_item_data = dap_chain_datum_tx_item_in_ems_to_json((dap_chain_tx_in_ems_t*)item);
+                break;
+            case TX_ITEM_TYPE_SIG:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_SIG");
+                l_obj_item_data = dap_chain_datum_tx_item_sig_to_json((dap_chain_tx_sig_t*)item);
+                break;
+            case TX_ITEM_TYPE_RECEIPT:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_RECEIPT");
+                l_obj_item_data = dap_chain_datum_tx_receipt_to_json((dap_chain_datum_tx_receipt_t*)item);
+                break;
+            case TX_ITEM_TYPE_IN_COND:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_COND");
+                l_obj_item_data = dap_chain_datum_tx_item_in_cond_to_json((dap_chain_tx_in_cond_t*)item);
+                break;
+            case TX_ITEM_TYPE_OUT_COND:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_COND");
+                
+
+                switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) {
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:
+                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_pay_to_json((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK:
+                        l_obj_item_data = dap_chain_net_srv_stake_lock_cond_out_to_json((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE:
+                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_stake_to_json((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:
+                        l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_xchange_to_json((dap_chain_tx_out_cond_t*)item);
+                        break;
+                    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE:
+                        l_obj_item_data = json_object_new_object();
+                        break;
+                   default:break;
+                }
+                // add time
+                dap_time_t l_ts_exp = ((dap_chain_tx_out_cond_t*)item)->header.ts_expires;
+                char l_time_str[32] = "never";
+                if (l_ts_exp) {
+                    dap_ctime_r(&l_ts_exp, l_time_str);                         /* Convert ts to  "Sat May 17 01:17:08 2014\n" */
+                    l_time_str[strlen(l_time_str)-1] = '\0';                    /* Remove "\n"*/
+                }
+                json_object_object_add(l_obj_item_data, "ts_expires", json_object_new_string(l_time_str));
+                json_object_object_add(l_obj_item_data, "subtype", json_object_new_string(dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype)));
+                json_object_object_add(l_obj_item_data, "value", json_object_new_string(dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->header.value)));
+                json_object_object_add(l_obj_item_data, "value_datoshi", json_object_new_string(dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->header.value)));
+                char * uid_str = DAP_NEW_SIZE(char, 32);
+                sprintf(uid_str, "0x%016"DAP_UINT64_FORMAT_x"", ((dap_chain_tx_out_cond_t*)item)->header.srv_uid.uint64);
+                json_object_object_add(l_obj_item_data, "uid", json_object_new_string(uid_str));
+                DAP_DEL_Z(uid_str);
+                break;
+            case TX_ITEM_TYPE_OUT_EXT:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_EXT");
+                l_obj_item_data = dap_chain_datum_tx_item_out_ext_to_json((dap_chain_tx_out_ext_t*)item);
+                break;
+            case TX_ITEM_TYPE_TSD:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_TSD");
+                l_obj_item_data = dap_chain_datum_tx_item_tsd_to_json((dap_chain_tx_tsd_t*)item);
+                break;
+            default: {
+                char *l_hash_str;
+                dap_get_data_hash_str_static(a_tx, dap_chain_datum_tx_get_size(a_tx), l_hash_str);
+                log_it(L_NOTICE, "Transaction %s has an item whose type cannot be handled by the dap_chain_datum_tx_to_json function.", l_hash_str);
+                break;
+            }
+        }
+        if (!l_obj_item_type){
+            json_object_array_add(l_obj_items, json_object_new_null());
+        } else {
+            if (!l_obj_item_data)
+                l_obj_item_data = json_object_new_null();
+            json_object *l_obj_item = json_object_new_object();
+            if (!l_obj_item) {
+                json_object_put(l_obj_item_type);
+                json_object_put(l_obj_item_data);
+                json_object_put(l_obj_items);
+                dap_json_rpc_allocation_error;
+                return NULL;
+            }
+            json_object_object_add(l_obj_item, "type", l_obj_item_type);
+            json_object_object_add(l_obj_item, "data", l_obj_item_data);
+            json_object_array_add(l_obj_items, l_obj_item);
+        }
+
+        l_tx_items_count += l_tx_item_size;
+    }
+    return l_obj_items;
+}
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_items.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_items.c
new file mode 100644
index 0000000000000000000000000000000000000000..7688d3cee037f16c2ea4ed1d55f3e43437bf1cee
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_items.c
@@ -0,0 +1,476 @@
+#include <stdint.h>
+#include <string.h>
+
+#include "dap_common.h"
+#include "dap_enc_key.h"
+#include "dap_chain_common.h"
+#include "dap_sign.h"
+#include "dap_hash.h"
+#include "dap_chain_datum_tx.h"
+#include "dap_chain_datum_tx_in.h"
+#include "dap_chain_datum_tx_out.h"
+#include "dap_chain_datum_tx_in_cond.h"
+#include "dap_chain_datum_tx_out_cond.h"
+#include "dap_chain_datum_tx_items.h"
+#include "dap_enc_base58.h"
+
+#include "dap_json_rpc_chain_datum_tx_items.h"
+#include "dap_json_rpc_chain_common.h"
+#include "dap_json_rpc_sign.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_datum_tx_items"
+
+json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *item) {
+        char * l_value_str = dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi);
+        char * l_coins_str = dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi);
+        dap_hash_fast_t * l_hash_tmp = &((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash;
+        char * l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp);
+        json_object *l_obj = json_object_new_object();
+        json_object *l_obj_value_str = json_object_new_string(l_value_str);
+        json_object *l_obj_coins_str = json_object_new_string(l_coins_str);
+        json_object * l_obj_hash_str = json_object_new_string(l_hash_str);
+        char * unit_str = DAP_NEW_SIZE(char, 32);
+        snprintf(unit_str, 32, "0x%08x", ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32);
+        if (!l_obj || !l_obj_coins_str || !l_obj_value_str || !unit_str) {
+            json_object_put(l_obj);
+            json_object_put(l_obj_coins_str);
+            json_object_put(l_obj_value_str);
+            DAP_DELETE(unit_str);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object * l_obj_unit_str = json_object_new_string(unit_str);
+        json_object_object_add(l_obj, "unit", l_obj_unit_str);
+        json_object_object_add(l_obj, "pkey", l_obj_hash_str);
+        json_object_object_add(l_obj, "max_price", l_obj_coins_str);
+        json_object_object_add(l_obj, "max_price_datoshi", l_obj_value_str);
+        DAP_DELETE(unit_str);
+        return l_obj;
+}
+
+json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange) {
+    if (a_srv_xchange->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE){
+        json_object *l_object = json_object_new_object();
+        char *l_value = dap_chain_balance_print(a_srv_xchange->header.value);
+        if (!l_value || !l_object) {
+            json_object_put(l_object);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_value = json_object_new_string(l_value);
+        if (!l_obj_value) {
+            json_object_put(l_object);
+            DAP_DEL_Z(l_value);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        DAP_DELETE(l_value);
+        json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_xchange->header.srv_uid.uint64);
+        json_object *l_obj_buy_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.buy_net_id);
+        json_object *l_obj_sell_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.sell_net_id);
+        json_object *l_obj_buy_token = json_object_new_string(a_srv_xchange->subtype.srv_xchange.buy_token);
+        char *l_rate = dap_chain_balance_to_coins(a_srv_xchange->subtype.srv_xchange.rate);
+        if (!l_rate || !l_obj_srv_uid || !l_obj_buy_net_id || !l_obj_sell_net_id || !l_obj_buy_token) {
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            json_object_put(l_obj_srv_uid);
+            json_object_put(l_obj_buy_net_id);
+            json_object_put(l_obj_sell_net_id);
+            json_object_put(l_obj_buy_token);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_rate = json_object_new_string(l_rate);
+        DAP_DELETE(l_rate);
+        json_object *l_obj_seller_addr = dap_chain_addr_to_json(&a_srv_xchange->subtype.srv_xchange.seller_addr);
+        if (!l_obj_seller_addr || !l_obj_rate) {
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            json_object_put(l_obj_srv_uid);
+            json_object_put(l_obj_buy_net_id);
+            json_object_put(l_obj_sell_net_id);
+            json_object_put(l_obj_buy_token);
+            json_object_put(l_obj_rate);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object_object_add(l_object, "value", l_obj_value);
+        json_object_object_add(l_object, "rate", l_obj_rate);
+        json_object_object_add(l_object, "srv_uid", l_obj_srv_uid);
+        json_object_object_add(l_object, "buy_net_id", l_obj_buy_net_id);
+        json_object_object_add(l_object, "sell_net_id", l_obj_sell_net_id);
+        json_object_object_add(l_object, "buy_token", l_obj_buy_token);
+        json_object_object_add(l_object, "seller_addr", l_obj_seller_addr);
+        //TODO: Parse TSD
+        return l_object;
+    }
+    return NULL;
+}
+
+json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake) {
+    if (a_srv_stake->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE) {
+        json_object *l_object = json_object_new_object();
+        char *l_value = dap_chain_balance_print(a_srv_stake->header.value);
+        if (!l_value || !l_object) {
+            json_object_put(l_object);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_value = json_object_new_string(l_value);
+        json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_stake->header.srv_uid.uint64);
+        json_object *l_obj_signing_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake_pos_delegate.signing_addr);
+        char *l_signer_node_addr = dap_strdup_printf(
+                NODE_ADDR_FP_STR,
+                NODE_ADDR_FP_ARGS_S(a_srv_stake->subtype.srv_stake_pos_delegate.signer_node_addr));
+        if (!l_signer_node_addr || !l_obj_signing_addr || !l_obj_srv_uid || !l_obj_value) {
+            json_object_put(l_obj_srv_uid);
+            json_object_put(l_obj_value);
+            json_object_put(l_object);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_signer_node_addr = json_object_new_string(l_signer_node_addr);
+        if (!l_obj_signer_node_addr) {
+            DAP_DELETE(l_signer_node_addr);
+            json_object_put(l_obj_srv_uid);
+            json_object_put(l_obj_value);
+            json_object_put(l_object);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        DAP_DELETE(l_value);
+        DAP_DELETE(l_signer_node_addr);
+        json_object_object_add(l_object, "value", l_obj_value);
+        json_object_object_add(l_object, "srv_uid", l_obj_srv_uid);
+        json_object_object_add(l_object, "signind_addr", l_obj_signing_addr);
+        json_object_object_add(l_object, "signer_node_addr", l_obj_signer_node_addr);
+        return l_object;
+    }
+    return NULL;
+}
+
+
+json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock)
+{
+    if (a_stake_lock->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) {
+        json_object *l_object = json_object_new_object();
+        if (!l_object) {
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        char *l_value = dap_chain_balance_print(a_stake_lock->header.value);
+        if (!l_value) {
+            json_object_put(l_object);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_value = json_object_new_string(l_value);
+        if (!l_obj_value) {
+            DAP_DELETE(l_value);
+            json_object_put(l_object);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        DAP_DELETE(l_value);
+        json_object *l_obj_srv_uid = json_object_new_uint64(a_stake_lock->header.srv_uid.uint64);
+        if (!l_obj_srv_uid) {
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        char *l_reinvest_precent = dap_chain_balance_print(a_stake_lock->subtype.srv_stake_lock.reinvest_percent);
+        if (!l_reinvest_precent) {
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_reinvest_percent = json_object_new_string(l_reinvest_precent);
+        if (!l_obj_reinvest_percent) {
+            DAP_DELETE(l_reinvest_precent);
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        DAP_DELETE(l_reinvest_precent);
+        json_object *l_obj_time_unlock = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.time_unlock);
+        if (!l_obj_time_unlock) {
+            json_object_put(l_obj_reinvest_percent);
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_flags = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.flags);
+        if (!l_obj_flags) {
+            json_object_put(l_obj_time_unlock);
+            json_object_put(l_obj_reinvest_percent);
+            json_object_put(l_object);
+            json_object_put(l_obj_value);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object_object_add(l_object, "value", l_obj_value);
+        json_object_object_add(l_object, "srv_uid", l_obj_srv_uid);
+        json_object_object_add(l_object, "reinvest_percent", l_obj_reinvest_percent);
+        json_object_object_add(l_object, "time_unlock", l_obj_time_unlock);
+        json_object_object_add(l_object, "flags", l_obj_flags);
+        return l_object;
+    }
+    return NULL;
+}
+
+
+json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out) {
+    json_object *l_object = json_object_new_object();
+    json_object *l_value_datoshi = json_object_new_string(dap_chain_balance_print(a_out->header.value));
+    json_object *l_value = json_object_new_string(dap_chain_balance_to_coins(a_out->header.value));
+    json_object *l_addr = dap_chain_addr_to_json(&a_out->addr);
+    if (!l_addr || !l_object || !l_addr) {
+        json_object_put(l_object);
+        json_object_put(l_value);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_object, "value", l_value);
+    json_object_object_add(l_object, "value_datoshi", l_value_datoshi);
+    json_object_object_add(l_object, "address", l_addr);
+    return l_object;
+}
+
+
+json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext) {
+    json_object *l_obj = json_object_new_object();
+    if (!l_obj) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    char *l_value = dap_chain_balance_print(a_out_ext->header.value);
+    if (!l_value) {
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_value = json_object_new_string(l_value);
+    DAP_DELETE(l_value);
+    if (!l_obj_value) {
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_addr = dap_chain_addr_to_json(&a_out_ext->addr);
+    if (!l_obj_addr) {
+        json_object_put(l_obj);
+        dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_ADDR_TO_JSON,
+                               "Can't get from addr JSON");
+        return NULL;
+    }
+    json_object *l_obj_token = json_object_new_string(a_out_ext->token);
+    if (!l_obj_token) {
+        json_object_put(l_obj_addr);
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_obj, "value", l_obj_value);
+    json_object_object_add(l_obj, "addr", l_obj_addr);
+    json_object_object_add(l_obj, "token", l_obj_token);
+    return l_obj;
+}
+
+json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond){
+    json_object *l_obj = json_object_new_object();
+    if (!l_obj) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_receipt_idx = json_object_new_uint64(a_in_cond->header.receipt_idx);
+    if (!l_obj_receipt_idx) {
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_out_prev_idx = json_object_new_uint64(a_in_cond->header.tx_out_prev_idx);
+    if (!l_obj_out_prev_idx) {
+        json_object_put(l_obj_receipt_idx);
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_prev_hash = NULL;
+    if (dap_hash_fast_is_blank(&a_in_cond->header.tx_prev_hash)){
+        l_obj_prev_hash = json_object_new_null();
+    } else {
+        char *l_prev_hash = dap_hash_fast_to_str_new(&a_in_cond->header.tx_prev_hash);
+        if(!l_prev_hash) {
+            json_object_put(l_obj_out_prev_idx);
+            json_object_put(l_obj_receipt_idx);
+            json_object_put(l_obj);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        l_obj_prev_hash = json_object_new_string(dap_strdup(l_prev_hash));
+        if (!l_obj_prev_hash) {
+            json_object_put(l_obj_out_prev_idx);
+            json_object_put(l_obj_receipt_idx);
+            json_object_put(l_obj);
+            DAP_DELETE(l_prev_hash);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        DAP_DELETE(l_prev_hash);
+    }
+    json_object_object_add(l_obj, "receipt_idx", l_obj_receipt_idx);
+    json_object_object_add(l_obj, "out_prev_idx", l_obj_out_prev_idx);
+    json_object_object_add(l_obj, "tx_prev_hash", l_obj_prev_hash);
+    return l_obj;
+}
+
+json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){
+    json_object *l_obj_in = json_object_new_object();
+    if (!l_obj_in) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_prev_idx = json_object_new_uint64(a_in->header.tx_out_prev_idx);
+    if (!l_obj_prev_idx) {
+        json_object_put(l_obj_in);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    char l_hash[DAP_CHAIN_HASH_FAST_STR_SIZE];
+    dap_chain_hash_fast_to_str(&a_in->header.tx_prev_hash, l_hash, sizeof(l_hash));
+    json_object *l_obj_hash = json_object_new_string(l_hash);
+    if (!l_obj_hash) {
+        json_object_put(l_obj_in);
+        json_object_put(l_obj_prev_idx);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_obj_in, "prev_idx", l_obj_prev_idx);
+    json_object_object_add(l_obj_in, "prev_hash", l_obj_hash);
+    return l_obj_in;
+}
+
+json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd){
+    json_object *l_object = json_object_new_object();
+    if (!l_object) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_tsd_type = json_object_new_int(a_tsd->header.type);
+    if(!l_obj_tsd_type) {
+        json_object_put(l_object);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_tsd_size = json_object_new_uint64(a_tsd->header.size);
+    if (!l_obj_tsd_size) {
+        json_object_put(l_obj_tsd_type);
+        json_object_put(l_object);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_data = json_object_new_string_len((char *)a_tsd->tsd, a_tsd->header.size);
+    if (!l_obj_data) {
+        json_object_put(l_obj_tsd_size);
+        json_object_put(l_obj_tsd_type);
+        json_object_put(l_object);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_object, "type", l_obj_tsd_type);
+    json_object_object_add(l_object, "size", l_obj_tsd_size);
+    json_object_object_add(l_object, "data", l_obj_data);
+    return l_object;
+}
+
+json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems)
+{
+    json_object *l_object = json_object_new_object();
+    if (!l_object) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_ticker = json_object_new_string(a_in_ems->header.ticker);
+    if (!l_obj_ticker){
+        json_object_put(l_object);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_chain_id = json_object_new_uint64(a_in_ems->header.token_emission_chain_id.uint64);
+    if (!l_obj_chain_id) {
+        json_object_put(l_object);
+        json_object_put(l_obj_ticker);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    char l_ehf[DAP_CHAIN_HASH_FAST_STR_SIZE];
+    dap_chain_hash_fast_to_str(&a_in_ems->header.token_emission_hash, l_ehf, sizeof(l_ehf));
+    json_object *l_obj_ehf = json_object_new_string(l_ehf);
+    if (!l_obj_ehf) {
+        json_object_put(l_object);
+        json_object_put(l_obj_chain_id);
+        json_object_put(l_obj_ticker);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_object, "ticker", l_obj_ticker);
+    json_object_object_add(l_object, "chain_id", l_obj_chain_id);
+    json_object_object_add(l_object, "emission_hash", l_obj_ehf);
+    return l_object;
+}
+
+json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee){
+    if (a_fee->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) {
+        json_object *l_obj = json_object_new_object();
+        if (!l_obj) {
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        char *l_balance = dap_chain_balance_print(a_fee->header.value);
+        if (!l_balance) {
+            json_object_put(l_obj);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object *l_obj_balance = json_object_new_string(l_balance);
+        DAP_DELETE(l_balance);
+        if (!l_obj_balance) {
+            json_object_put(l_obj);
+            dap_json_rpc_allocation_error;
+            return NULL;
+        }
+        json_object_object_add(l_obj, "balance", l_obj_balance);
+        return l_obj;
+    }
+    return NULL;
+}
+
+json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig){
+    json_object *l_object = json_object_new_object();
+    if (!l_object) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_sign_size = json_object_new_uint64(a_sig->header.sig_size);
+    if (!l_sign_size) {
+        json_object_put(l_object);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_sign = dap_sign_to_json((dap_sign_t*)a_sig->sig);
+    if (!l_sign) {
+        json_object_put(l_object);
+        json_object_put(l_sign_size);
+        dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON,
+                               "Error serializing signature to JSON.");
+        return NULL;
+    }
+    json_object_object_add(l_object, "sign_size", l_sign_size);
+    json_object_object_add(l_object, "sign", l_sign);
+    return l_object;
+}
diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_receipt.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_receipt.c
new file mode 100644
index 0000000000000000000000000000000000000000..a86b12ac71d51d6293938deb0659bec973cc07cf
--- /dev/null
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_receipt.c
@@ -0,0 +1,117 @@
+#include "dap_common.h"
+#include "dap_enc_key.h"
+#include "dap_sign.h"
+#include "dap_chain_datum_tx_receipt.h"
+
+#include "dap_json_rpc_sign.h"
+#include "dap_json_rpc_chain_datum_tx_receipt.h"
+#include "json.h"
+
+#define LOG_TAG "dap_json_rpc_chain_datum_tx_receipt"
+
+
+json_object* dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info){
+    json_object *l_obj = json_object_new_object();
+    if (!l_obj) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_srv_uid = json_object_new_uint64(a_info->srv_uid.uint64);
+    if (!l_obj_srv_uid) {
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_obj, "uid", l_obj_srv_uid);
+
+#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
+    json_object *l_obj_addition = json_object_new_uint64(a_info->addition);
+    if (!l_obj_addition){
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_obj, "ext_size", l_obj_addition);
+#endif
+
+    json_object * l_obj_units = json_object_new_uint64(a_info->units);
+    json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_info->units_type.enm));
+    if (!l_obj_units_type || !l_obj_units) {
+        json_object_put(l_obj);
+        json_object_put(l_obj_units);
+        json_object_put(l_obj_units_type);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_obj, "units", l_obj_units);
+    json_object_object_add(l_obj, "units_type", l_obj_units_type);
+
+    char *l_value = dap_chain_balance_to_coins(a_info->value_datoshi);
+    char *l_datoshi_value = dap_chain_balance_print(a_info->value_datoshi);
+    json_object *l_obj_datoshi = json_object_new_string(l_datoshi_value);
+    json_object *l_obj_value = json_object_new_string(l_value);
+    if (!l_obj_datoshi || !l_obj_value) {
+        json_object_put(l_obj_value);
+        json_object_put(l_obj_datoshi);
+        DAP_DELETE(l_datoshi_value);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+
+    DAP_DELETE(l_datoshi_value);
+    DAP_DELETE(l_value);
+
+    json_object_object_add(l_obj, "value", l_obj_value);
+    json_object_object_add(l_obj, "value_datoshi", l_obj_datoshi);
+    return l_obj;
+}
+
+json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt) {
+    json_object *l_obj = json_object_new_object();
+    if (!l_obj) {
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_info = dap_chain_receipt_info_to_json(&a_receipt->receipt_info);
+    if (!l_obj_info) {
+        json_object_put(l_obj);
+        return NULL;
+    }
+    json_object *l_obj_size = json_object_new_uint64(a_receipt->size);
+    if (!l_obj_size) {
+        json_object_put(l_obj);
+        json_object_put(l_obj_info);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    //Provider
+    dap_sign_t *l_first_sign  = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 1);
+    //Client
+    dap_sign_t *l_second_sign  = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 2);
+    json_object *l_obj_signs = json_object_new_object();
+    if (!l_obj_signs) {
+        json_object_put(l_obj_size);
+        json_object_put(l_obj_info);
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_obj_provider_sign = dap_sign_to_json(l_first_sign);
+    json_object *l_obj_client_sign = dap_sign_to_json(l_second_sign);
+    json_object_object_add(l_obj_signs, "provider", l_obj_provider_sign);
+    json_object_object_add(l_obj_signs, "client", l_obj_client_sign);
+    json_object *l_exts_data = json_object_new_string_len((char *)a_receipt->exts_n_signs, a_receipt->exts_size);
+    if (!l_exts_data) {
+        json_object_put(l_obj_size);
+        json_object_put(l_obj_info);
+        json_object_put(l_obj_signs);
+        json_object_put(l_obj);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object_object_add(l_obj, "info", l_obj_info);
+    json_object_object_add(l_obj, "size", l_obj_size);
+    json_object_object_add(l_obj, "sings", l_obj_signs);
+    json_object_object_add(l_obj, "exts_data", l_exts_data);
+    return l_obj;
+}
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_common.h b/modules/json_rpc/common/include/dap_json_rpc_chain_common.h
new file mode 100644
index 0000000000000000000000000000000000000000..2e6c4a73168e1443551b3f76658bbd11a15cd354
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_common.h
@@ -0,0 +1,35 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_common.h"
+#include "dap_json_rpc_errors.h"
+
+json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr);
+
+DAP_STATIC_INLINE json_object *dap_chain_net_id_to_json(dap_chain_net_id_t a_net_id) {
+    return json_object_new_uint64(a_net_id.uint64);
+}
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum.h
new file mode 100644
index 0000000000000000000000000000000000000000..eb42fa19d973e5e419bd151a9044afa5dc769d72
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum.h
@@ -0,0 +1,31 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum.h"
+#include "dap_json_rpc_errors.h"
+
+json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum);
+json_object * dap_chain_datum_data_to_json(dap_chain_datum_t *a_datum);
\ No newline at end of file
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_anchor.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_anchor.h
new file mode 100644
index 0000000000000000000000000000000000000000..96a03be72ea9765bf80d2c0ebdc0d6d88dc4cdfa
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_anchor.h
@@ -0,0 +1,33 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum_anchor.h"
+#include "dap_json_rpc_errors.h"
+
+json_object *dap_chain_datum_anchor_to_json(dap_chain_datum_anchor_t *a_anchor);
+
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_decree.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_decree.h
new file mode 100644
index 0000000000000000000000000000000000000000..31342d753823df2342d40807d85d8c5e8150b804
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_decree.h
@@ -0,0 +1,35 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum_decree.h"
+#include "dap_json_rpc_errors.h"
+
+/**
+ * @brief dap_chain_datum_decree_to_json Convert dap_chain_datum_decree_t tp json_object
+ * @param a_decree pointer to decree
+ * @return pointer json_object
+ */
+json_object *dap_chain_datum_decree_to_json(dap_chain_datum_decree_t *a_decree);
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_token.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_token.h
new file mode 100644
index 0000000000000000000000000000000000000000..f9232771ba683add56956657d9d0b8daa5ac434e
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_token.h
@@ -0,0 +1,33 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum_token.h"
+#include "dap_json_rpc_errors.h"
+
+json_object *dap_chain_datum_token_to_json(dap_chain_datum_token_t * a_token, size_t a_token_size);
+json_object *dap_chain_datum_token_flags_to_json(uint16_t a_flags);
+json_object *dap_chain_datum_emission_to_json(dap_chain_datum_token_emission_t *a_emission, size_t a_emission_size);
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx.h
new file mode 100644
index 0000000000000000000000000000000000000000..71a89ae9da616614fea742cc774611e9f1ced68c
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx.h
@@ -0,0 +1,31 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum_tx.h"
+#include "dap_json_rpc_errors.h"
+
+json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx);
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_items.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_items.h
new file mode 100644
index 0000000000000000000000000000000000000000..fdc37b126e9fd65740d18a332b90067bbe4585bb
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_items.h
@@ -0,0 +1,42 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum_tx_items.h"
+#include "dap_json_rpc_errors.h"
+
+
+json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems);
+json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in);
+json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd);
+json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond);
+json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out);
+json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext);
+json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee);
+json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *item);
+json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange);
+json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake);
+json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock);
+json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig);
diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_receipt.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_receipt.h
new file mode 100644
index 0000000000000000000000000000000000000000..a14a231ff23e555066d616e997532bef5b6b8e95
--- /dev/null
+++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_receipt.h
@@ -0,0 +1,31 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_chain_datum_tx_receipt.h"
+#include "dap_json_rpc_errors.h"
+
+json_object *dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info);
+json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt);
\ No newline at end of file
diff --git a/modules/json_rpc/mempool/CMakeLists.txt b/modules/json_rpc/mempool/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..86dd39002f2fcdb106097bb8e27b241869f6b3ff
--- /dev/null
+++ b/modules/json_rpc/mempool/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.10)
+project (dap_json_rpc_chain_mempool)
+
+
+file(GLOB DAP_JSON_RPC_CHAIN_MEMPOOL_HEADERS include/*.h)
+file(GLOB DAP_JSON_RPC_CHAIN_MEMPOOL_SRCS  *.c)
+
+add_library(${PROJECT_NAME}  STATIC ${DAP_JSON_RPC_CHAIN_MEMPOOL_SRCS} ${DAP_JSON_RPC_CHAIN_MEMPOOL_HEADERS})
+
+target_link_libraries(dap_json_rpc_chain_mempool dap_http_server dap_client dap_chain_net dap_global_db dap_core dap_chain_cs_blocks dap_chain_mempool dap_json_rpc_core dap_chain_btc_rpc)
+target_include_directories(dap_json_rpc_chain_mempool PUBLIC include/ )
diff --git a/modules/mempool/dap_chain_mempool_rpc.c b/modules/json_rpc/mempool/dap_chain_mempool_rpc.c
similarity index 71%
rename from modules/mempool/dap_chain_mempool_rpc.c
rename to modules/json_rpc/mempool/dap_chain_mempool_rpc.c
index 5f03b2867e8e7125c144ebfe58988c9299392c59..3f97641be08af203e9d91170c3b8b033416c7795 100644
--- a/modules/mempool/dap_chain_mempool_rpc.c
+++ b/modules/json_rpc/mempool/dap_chain_mempool_rpc.c
@@ -1,6 +1,53 @@
-#include "dap_chain_mempool_rpc.h"
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <memory.h>
+
+#ifdef _WIN32
+#include <winsock2.h>
+#include <windows.h>
+#include <mswsock.h>
+#include <ws2tcpip.h>
+#include <io.h>
+#include <time.h>
+#include <pthread.h>
+#endif
+
+#include "dap_common.h"
+#include "dap_hash.h"
+#include "dap_http_client.h"
+#include "dap_http_simple.h"
+#include "dap_enc_base58.h"
+#include "dap_enc_http.h"
+#include "http_status_code.h"
+#include "dap_chain_common.h"
+#include "dap_chain_node.h"
+#include "dap_global_db.h"
+#include "dap_enc.h"
+#include <dap_enc_http.h>
+#include <dap_enc_key.h>
+#include <dap_enc_ks.h>
 #include "dap_chain_mempool.h"
 
+#include "dap_common.h"
+#include "dap_list.h"
+#include "dap_chain.h"
+#include "dap_chain_net.h"
+#include "dap_chain_net_tx.h"
+#include "dap_sign.h"
+#include "dap_chain_datum_tx.h"
+#include "dap_chain_datum_tx_items.h"
+#include "dap_chain_net_srv.h"
+#include "dap_chain_cs_blocks.h"
+
+#include "dap_chain_mempool_rpc.h"
+#include "dap_json_rpc_chain_datum.h"
+#include "dap_json_rpc_request_handler.h"
+#include "dap_json_rpc_response_handler.h"
+#include "json.h"
+
 #define LOG_TAG "dap_chain_mempool_rpc"
 
 int dap_chain_mempool_rpc_init(void) {
@@ -14,27 +61,27 @@ void dap_chain_mempool_rpc_handler_test(dap_json_rpc_params_t *a_params,
     UNUSED(a_method);
     char *l_tn = NULL;
 //    char *l_chain_str = NULL;
-    for (uint32_t i = 0; i < a_params->lenght; i++) {
+    for (uint32_t i = 0; i < a_params->length; i++) {
         dap_json_rpc_param_t *l_prm = a_params->params[i];
         if (i == 0)
             l_tn = l_prm->value_param;
     }
     if (dap_strcmp(l_tn, "NULL") == 0) {
-        a_response->type_result = TYPE_RESPONSE_NULL;
+        a_response->type = TYPE_RESPONSE_NULL;
     } else if (dap_strcmp(l_tn, "STRING") == 0) {
-        a_response->type_result = TYPE_RESPONSE_STRING;
+        a_response->type = TYPE_RESPONSE_STRING;
         a_response->result_string = dap_strdup("This test string");
     } else if (dap_strcmp(l_tn, "INTEGER") == 0) {
-        a_response->type_result = TYPE_RESPONSE_INTEGER;
+        a_response->type = TYPE_RESPONSE_INTEGER;
         a_response->result_int = 4555745;
     } else if (dap_strcmp(l_tn, "BOOLEAN") == 0) {
-        a_response->type_result = TYPE_RESPONSE_BOOLEAN;
+        a_response->type = TYPE_RESPONSE_BOOLEAN;
         a_response->result_boolean = true;
     } else if (dap_strcmp(l_tn, "DOUBLE") == 0) {
-        a_response->type_result = TYPE_RESPONSE_DOUBLE;
+        a_response->type = TYPE_RESPONSE_DOUBLE;
         a_response->result_double = 75.545;
     } else if (dap_strcmp(l_tn, "JSON") == 0) {
-        a_response->type_result = TYPE_RESPONSE_JSON;
+        a_response->type = TYPE_RESPONSE_JSON;
         json_object *l_obj = json_object_new_object();
         json_object *l_int = json_object_new_uint64(45577445);
         json_object *l_boolean = json_object_new_boolean((json_bool)1);
@@ -59,7 +106,7 @@ void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params,
                                         dap_json_rpc_response_t *a_response, const char *a_method) {
     char *l_net_str = NULL;
     char *l_chain_str = NULL;
-    for (uint32_t i = 0; i < a_params->lenght; i++) {
+    for (uint32_t i = 0; i < a_params->length; i++) {
         dap_json_rpc_param_t *l_prm = a_params->params[i];
         if (i == 0)
             l_net_str = l_prm->value_param;
@@ -68,7 +115,7 @@ void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params,
     }
     dap_chain_net_t  *l_net = dap_chain_net_by_name(l_net_str);
     dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str);
-    a_response->type_result = TYPE_RESPONSE_STRING;
+    a_response->type = TYPE_RESPONSE_STRING;
     char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain);
     if(!l_gdb_group_mempool){
         a_response->result_string = "{\"datums\":[]}";
@@ -93,7 +140,7 @@ void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params,
         json_object_array_add(l_object_array, l_obj_datum);
     }
     json_object_object_add(l_object, "datums", l_object_array);
-    a_response->type_result = TYPE_RESPONSE_JSON;
+    a_response->type = TYPE_RESPONSE_JSON;
     a_response->result_json_object = l_object;
 
     DAP_DELETE(l_gdb_group_mempool);
diff --git a/modules/json_rpc/mempool/include/dap_chain_mempool_rpc.h b/modules/json_rpc/mempool/include/dap_chain_mempool_rpc.h
new file mode 100644
index 0000000000000000000000000000000000000000..f09bdc17afd4acc8722769a09d425e85bc3c456b
--- /dev/null
+++ b/modules/json_rpc/mempool/include/dap_chain_mempool_rpc.h
@@ -0,0 +1,37 @@
+/*
+ * Authors:
+ * Alexey V. Stratulat <alexey.stratulat@demlabs.net>
+ * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net>
+ * DeM Labs Inc.   https://demlabs.net
+ * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk
+ * Copyright  (c) 2017-2023
+ * 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 "dap_json_rpc_errors.h"
+#include "dap_json_rpc_response.h"
+#include "dap_json_rpc_params.h"
+
+
+int dap_chain_mempool_rpc_init(void);
+void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params,
+                                        dap_json_rpc_response_t *a_response, const char *a_method);
+void dap_chain_mempool_rpc_handler_test(dap_json_rpc_params_t *a_params,
+                                        dap_json_rpc_response_t *a_response, const char *a_method);
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 13478d400a4970f8defae20f429eb17bc9d3e605..d9e41a58b645cea085257ade296d03fb159e50e3 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -78,7 +78,6 @@ static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_db
 
 int dap_datum_mempool_init(void)
 {
-    dap_chain_mempool_rpc_init();
     return 0;
 }
 
diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt
index 97eceff79888dfdf561a62700236e0d2a1f95b76..6fca1d33d2056731e63a2ece9cc51ae9c02e6383 100644
--- a/modules/net/CMakeLists.txt
+++ b/modules/net/CMakeLists.txt
@@ -30,7 +30,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS
 
 target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_client dap_io dap_notify_srv dap_cli_server dap_chain dap_chain_wallet
                                         dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_net_srv_xchange dap_chain_cs_none
-                                        dap_stream_ch_chain_net dap_stream_ch_chain_voting dap_chain_cs_esbocs)
+                                        dap_stream_ch_chain_net dap_stream_ch_chain_voting dap_chain_cs_esbocs dap_json_rpc dap_json_rpc_chain_common)
 if(LINUX)
     target_link_libraries(${PROJECT_NAME} resolv)
 endif()
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 0804aeae13f477f382c851e58ab16e11323965f8..d839e10623d706334c1ec40b53439faacc2f2f28 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -112,9 +112,14 @@
 #include "dap_chain_node_net_ban_list.h"
 #include "dap_chain_net_node_list.h"
 
+#include "dap_json_rpc_errors.h"
+#include "dap_json_rpc_chain_datum.h"
+
+
 #define LOG_TAG "chain_node_cli_cmd"
 
 static void s_dap_chain_net_purge(dap_chain_net_t *a_net);
+int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void ** reply);
 
 /**
  * @brief dap_list_t* get_aliases_by_name Get the aliases by name object
@@ -597,8 +602,9 @@ void s_dap_chain_net_purge(dap_chain_net_t * a_net)
  * @return int
  * return 0 OK, -1 Err
  */
-int com_global_db(int a_argc, char ** a_argv, char **a_str_reply)
+int com_global_db(int a_argc, char ** a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ, CMD_DELETE, CMD_DROP, CMD_GET_KEYS
     };
@@ -1022,8 +1028,9 @@ static dap_tsd_t* s_chain_node_cli_com_node_create_tsd_addr(char **a_argv, int a
 /**
  * Node command
  */
-int com_node(int a_argc, char ** a_argv, char **a_str_reply)
+int com_node(int a_argc, char ** a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         CMD_NONE, CMD_ADD, CMD_DEL, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER,
         CMD_BAN, CMD_UNBAN, CMD_BANLIST
@@ -1606,8 +1613,9 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_traceroute(int argc, char** argv, char **a_str_reply)
+int com_traceroute(int argc, char** argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
 #ifdef DAP_OS_LINUX
     const char *addr = NULL;
     int hops = 0, time_usec = 0;
@@ -1696,8 +1704,9 @@ int com_traceroute(int argc, char** argv, char **a_str_reply)
  * @return int
  * return 0 OK, -1 Err
  */
-int com_tracepath(int argc, char** argv, char **a_str_reply)
+int com_tracepath(int argc, char** argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
 #ifdef DAP_OS_LINUX
     const char *addr = NULL;
     int hops = 0, time_usec = 0;
@@ -1779,8 +1788,9 @@ int com_tracepath(int argc, char** argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_ping(int a_argc, char**a_argv, char **a_str_reply)
+int com_ping(int a_argc, char**a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
 #ifdef DAP_OS_LINUX
 
     int n = 4,w = 0;
@@ -1861,8 +1871,9 @@ int com_ping(int a_argc, char**a_argv, char **a_str_reply)
  * @param str_reply
  * @return
  */
-int com_version(int argc, char ** argv, char **a_str_reply)
+int com_version(int argc, char ** argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     (void) argc;
     (void) argv;
 #ifndef DAP_VERSION
@@ -1884,8 +1895,9 @@ int com_version(int argc, char ** argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_help(int a_argc, char **a_argv, char **a_str_reply)
+int com_help(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     if (a_argc > 1) {
         log_it(L_DEBUG, "Help for command %s", a_argv[1]);
         dap_cli_cmd_t *l_cmd = dap_cli_server_cmd_find(a_argv[1]);
@@ -1924,8 +1936,9 @@ int com_help(int a_argc, char **a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_tx_wallet(int a_argc, char **a_argv, char **a_str_reply)
+int com_tx_wallet(int a_argc, char **a_argv, void **reply)
 {
+char ** a_str_reply = (char **) reply;
 const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
 enum { CMD_NONE, CMD_WALLET_NEW, CMD_WALLET_LIST, CMD_WALLET_INFO, CMD_WALLET_ACTIVATE, CMD_WALLET_DEACTIVATE, CMD_WALLET_CONVERT };
 int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
@@ -2289,7 +2302,82 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
 }
 
 
+typedef enum dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json {
+    DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING = 101,
+    DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL = 102,
+    DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND = 103,
+    DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND = 104,
+    DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_STR_IS_NULL = 105,
+    DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM = 106,
+    DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET = 107
+} dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json;
+int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int a_argc,
+                                                           char **a_argv,
+                                                           dap_chain_t **a_chain, dap_chain_net_t **a_net) {
+    const char * l_chain_str = NULL;
+    const char * l_net_str = NULL;
+
+    // Net name
+    if(a_net)
+        dap_cli_server_cmd_find_option_val(a_argv, *a_arg_index, a_argc, "-net", &l_net_str);
+    else {
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING,
+                               "Error in internal command processing.");
+        return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING;
+    }
+
+    // Select network
+    if(!l_net_str) {
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL, "%s requires parameter '-net'", a_argv[0]);
+        return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL;
+    }
 
+    if((*a_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network
+        char l_str_to_reply_chain[500] = {0};
+        char *l_str_to_reply = NULL;
+        sprintf(l_str_to_reply_chain, "%s can't find network \"%s\"\n", a_argv[0], l_net_str);
+        l_str_to_reply = dap_strcat2(l_str_to_reply,l_str_to_reply_chain);
+        dap_string_t* l_net_str = dap_cli_list_net();
+        l_str_to_reply = dap_strcat2(l_str_to_reply,l_net_str->str);
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND, "%s can't find network \"%s\"\n%s", a_argv[0], l_net_str, l_str_to_reply);
+        return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND;
+    }
+
+    // Chain name
+    if(a_chain) {
+        dap_cli_server_cmd_find_option_val(a_argv, *a_arg_index, a_argc, "-chain", &l_chain_str);
+
+        // Select chain
+        if(l_chain_str) {
+            if ((*a_chain = dap_chain_net_get_chain_by_name(*a_net, l_chain_str)) == NULL) { // Can't find such chain
+                char l_str_to_reply_chain[500] = {0};
+                char *l_str_to_reply = NULL;
+                sprintf(l_str_to_reply_chain, "%s requires parameter '-chain' to be valid chain name in chain net %s. Current chain %s is not valid\n",
+                        a_argv[0], l_net_str, l_chain_str);
+                l_str_to_reply = dap_strcat2(l_str_to_reply,l_str_to_reply_chain);
+                dap_chain_t * l_chain;
+                dap_chain_net_t * l_chain_net = *a_net;
+                l_str_to_reply = dap_strcat2(l_str_to_reply,"\nAvailable chains:\n");
+                DL_FOREACH(l_chain_net->pub.chains, l_chain) {
+                    l_str_to_reply = dap_strcat2(l_str_to_reply,"\t");
+                    l_str_to_reply = dap_strcat2(l_str_to_reply,l_chain->name);
+                    l_str_to_reply = dap_strcat2(l_str_to_reply,"\n");
+                }
+                dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND, l_str_to_reply);
+                return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND;
+            }
+        }
+        else if (!strcmp(a_argv[0], "token_decl")  || !strcmp(a_argv[0], "token_decl_sign")) {
+            if (	(*a_chain = dap_chain_net_get_default_chain_by_chain_type(*a_net, CHAIN_TYPE_TOKEN)) == NULL )
+            {
+                dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM, "%s requires parameter '-chain' or set default datum "
+                                             "type in chain configuration file");
+                return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM;
+            }
+        }
+    }
+    return 0;
+}
 
 
 /**
@@ -2431,8 +2519,9 @@ static dap_chain_datum_token_t * s_sign_cert_in_cycle(dap_cert_t ** l_certs, dap
  * @param str_reply
  * @return
  */
-int com_token_decl_sign(int a_argc, char **a_argv, char ** a_str_reply)
+int com_token_decl_sign(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
 
     const char * l_hash_out_type = NULL;
@@ -2737,184 +2826,425 @@ const char* s_tx_get_main_ticker(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_
  * @param a_str_tmp
  * @param a_hash_out_type
  */
-void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, dap_string_t * a_str_tmp, const char *a_hash_out_type, bool a_fast){
-    int l_removed = 0;
+void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, json_object *a_json_obj, const char *a_hash_out_type) {
     dap_chain_addr_t *l_wallet_addr = dap_chain_addr_from_str(a_add);
     if (a_add && !l_wallet_addr) {
-        dap_string_append_printf(a_str_tmp, "Cannot convert string '%s' to binary address.\n", a_add);
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET, "Cannot convert "
+                               "string '%s' to binary address.\n", a_add);
+        return;
+    }
+    char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
+    if(!l_gdb_group_mempool){
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_GET_MEMPOOL_GROUP,
+                               "%s.%s: chain not found\n", a_net->pub.name, a_chain->name);
         return;
     }
-    if (l_wallet_addr && a_fast) {
-        dap_string_append_printf(a_str_tmp, "In fast mode, it is impossible to count the number of "
-                                            "transactions and emissions for a specific address. The -fast and -addr "
-                                            "options are mutually exclusive.\n");
-        DAP_DELETE(l_wallet_addr);
+    int l_removed = 0;
+    json_object *l_obj_chain = json_object_new_object();
+    json_object *l_obj_chain_name  = json_object_new_string(a_chain->name);
+    if (!l_obj_chain_name || !l_obj_chain) {
+        json_object_put(l_obj_chain);
+        dap_json_rpc_allocation_error;
         return;
     }
+    json_object_object_add(l_obj_chain, "name", l_obj_chain_name);
     dap_chain_mempool_filter(a_chain, &l_removed);
-    dap_string_append_printf(a_str_tmp, "Removed %i records from the %s chain mempool in %s network. \n\n",
-                             l_removed, a_chain->name, a_net->pub.name);
-    char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
-    if (!l_gdb_group_mempool){
-        dap_string_append_printf(a_str_tmp, "%s.%s: chain not found\n", a_net->pub.name, a_chain->name);
+    json_object *l_jobj_removed = json_object_new_int(l_removed);
+    if (!l_jobj_removed) {
+        json_object_put(l_obj_chain);
+        dap_json_rpc_allocation_error;
+        return;
+    }
+    json_object_object_add(l_obj_chain, "removed", l_jobj_removed);
+    size_t l_objs_count = 0;
+    size_t l_objs_addr = 0;
+    dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_count);
+    json_object  *l_jobj_datums;
+    if (l_objs_count == 0) {
+        l_jobj_datums = json_object_new_null();
     } else {
-        size_t l_objs_count = 0;
-        size_t l_objs_addr = 0;
-        dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_count);
-        for(size_t i = 0; i < l_objs_count; i++) {
-            dap_chain_datum_t *l_datum = (dap_chain_datum_t *) l_objs[i].value;
-            if (!l_datum->header.data_size || (l_datum->header.data_size > l_objs[i].value_len)) {
-                log_it(L_ERROR, "Trash datum in GDB %s.%s, key: %s data_size:%u, value_len:%zu",
-                       a_net->pub.name, a_chain->name, l_objs[i].key, l_datum->header.data_size, l_objs[i].value_len);
-                dap_global_db_del_sync(l_gdb_group_mempool, l_objs[i].key);
-                continue;
+        l_jobj_datums = json_object_new_array();
+        if (!l_jobj_datums) {
+            json_object_put(l_obj_chain);
+            dap_json_rpc_allocation_error;
+            return;
+        }
+    }
+    for(size_t i = 0; i < l_objs_count; i++) {
+        dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
+        if (!l_datum->header.data_size || (l_datum->header.data_size > l_objs[i].value_len)) {
+            log_it(L_ERROR, "Trash datum in GDB %s.%s, key: %s data_size:%u, value_len:%zu",
+                    a_net->pub.name, a_chain->name, l_objs[i].key, l_datum->header.data_size, l_objs[i].value_len);
+            dap_global_db_del_sync(l_gdb_group_mempool, l_objs[i].key);
+            continue;
+        }
+        dap_time_t l_ts_create = (dap_time_t) l_datum->header.ts_create;
+        const char *l_datum_type = dap_chain_datum_type_id_to_str(l_datum->header.type_id);
+        dap_hash_fast_t l_datum_real_hash = {0};
+        dap_hash_fast_t l_datum_hash_from_key = {0};
+        dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_datum_real_hash);
+        dap_chain_hash_fast_from_str(l_objs[i].key, &l_datum_hash_from_key);
+        char buff_time[50];
+        dap_time_to_str_rfc822(buff_time, 50, l_datum->header.ts_create);
+        json_object *l_jobj_type = json_object_new_string(l_datum_type);
+        json_object *l_jobj_hash = json_object_new_string(l_objs[i].key);
+        json_object *l_jobj_ts_created = json_object_new_object();
+        json_object *l_jobj_ts_created_time_stamp = json_object_new_uint64(l_ts_create);
+        json_object *l_jobj_ts_created_str = json_object_new_string(buff_time);
+        if (!l_jobj_type || !l_jobj_hash || !l_jobj_ts_created || !l_jobj_ts_created_str || !l_jobj_ts_created_time_stamp) {
+            json_object_put(l_jobj_type);
+            json_object_put(l_jobj_hash);
+            json_object_put(l_jobj_ts_created);
+            json_object_put(l_jobj_ts_created_time_stamp);
+            json_object_put(l_jobj_ts_created_str);
+            json_object_put(l_jobj_datums);
+            json_object_put(l_obj_chain);
+            dap_global_db_objs_delete(l_objs, l_objs_count);
+            DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+            return;
+        }
+        json_object_object_add(l_jobj_ts_created, "time_stamp", l_jobj_ts_created_time_stamp);
+        json_object_object_add(l_jobj_ts_created, "str", l_jobj_ts_created_str);
+        json_object *l_jobj_datum = json_object_new_object();
+        if (!l_jobj_datum) {
+            json_object_put(l_jobj_type);
+            json_object_put(l_jobj_hash);
+            json_object_put(l_jobj_ts_created);
+            json_object_put(l_jobj_ts_created_time_stamp);
+            json_object_put(l_jobj_ts_created_str);
+            json_object_put(l_jobj_datums);
+            json_object_put(l_obj_chain);
+            dap_global_db_objs_delete(l_objs, l_objs_count);
+            DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+            return;
+        }
+        if (!dap_hash_fast_compare(&l_datum_real_hash, &l_datum_hash_from_key)){
+            char *l_drh_str = dap_hash_fast_to_str_new(&l_datum_real_hash);
+            char *l_wgn = dap_strdup_printf("Key field in DB %s does not match datum's hash %s\n",
+                                            l_objs[i].key, l_drh_str);
+            DAP_DELETE(l_drh_str);
+            if (!l_wgn) {
+                dap_global_db_objs_delete(l_objs, l_objs_count);
+                json_object_put(l_jobj_datum);
+                json_object_put(l_obj_chain);
+                json_object_put(l_jobj_type);
+                json_object_put(l_jobj_hash);
+                json_object_put(l_jobj_ts_created);
+                json_object_put(l_jobj_datums);
+                dap_json_rpc_allocation_error;
+                return;
+            }
+            json_object *l_jobj_warning = json_object_new_string(l_wgn);
+            DAP_DELETE(l_wgn);
+            if (!l_jobj_warning) {
+                dap_global_db_objs_delete(l_objs, l_objs_count);
+                json_object_put(l_jobj_datum);
+                json_object_put(l_obj_chain);
+                json_object_put(l_jobj_type);
+                json_object_put(l_jobj_hash);
+                json_object_put(l_jobj_ts_created);
+                json_object_put(l_jobj_datums);
+                dap_json_rpc_allocation_error;
+                return;
             }
-            dap_time_t l_ts_create = (dap_time_t) l_datum->header.ts_create;
-            const char *l_datum_type = dap_chain_datum_type_id_to_str(l_datum->header.type_id);
-            char buff_time[50];
-            dap_time_to_str_rfc822(buff_time, 50, l_datum->header.ts_create);
-            dap_string_append_printf(a_str_tmp, "%s hash %s %s\n", l_datum_type, l_objs[i].key, buff_time);
-            if (!a_fast) {
-                bool datum_is_accepted_addr = false;
-                switch (l_datum->header.type_id) {
-                    case DAP_CHAIN_DATUM_TX: {
-                        dap_chain_addr_t l_addr_from;
-                        dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *) l_datum->data;
-                        const char *l_main_token = s_tx_get_main_ticker(l_tx, a_net, NULL);
-                        dap_list_t *l_list_sig_item = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_SIG, NULL);
-                        if (!l_list_sig_item) {
-                            dap_string_append_printf(a_str_tmp,
-                                                     "\tAn item with a type TX_ITEM_TYPE_SIG for the transaction "
-                                                     "was not found, the transaction may be corrupted.\n");
-                            break;
+            json_object_object_add(l_jobj_datum, "warning", l_jobj_warning);
+            json_object_array_add(l_jobj_datums, l_jobj_datum);
+            continue;
+        }
+        json_object_object_add(l_jobj_datum, "hash", l_jobj_hash);
+        json_object_object_add(l_jobj_datum, "type", l_jobj_type);
+        json_object_object_add(l_jobj_datum, "created", l_jobj_ts_created);
+        bool datum_is_accepted_addr = false;
+        switch (l_datum->header.type_id) {
+            case DAP_CHAIN_DATUM_TX: {
+                dap_chain_addr_t l_addr_from;
+                dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data;
+                const char *l_main_token = s_tx_get_main_ticker(l_tx, a_net, NULL);
+                dap_list_t *l_list_sig_item = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_SIG, NULL);
+                if (!l_list_sig_item) {
+                    json_object *l_jobj_wgn = json_object_new_string("An item with a type TX_ITEM_TYPE_SIG for the "
+                                                                     "transaction was not found, the transaction may "
+                                                                     "be corrupted.");
+                    json_object_object_add(l_jobj_datum, "warning", l_jobj_wgn);
+                    break;
+                }
+                dap_chain_tx_sig_t *l_sig = l_list_sig_item->data;
+                dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig(l_sig);
+                dap_chain_addr_fill_from_sign(&l_addr_from, l_sign, a_net->pub.id);
+                if (l_wallet_addr && dap_chain_addr_compare(l_wallet_addr, &l_addr_from)) {
+                    datum_is_accepted_addr = true;
+                }
+                dap_list_free(l_list_sig_item);
+                char *l_addr_from_str = dap_chain_addr_to_str(&l_addr_from);
+                if (!l_addr_from_str) {
+                    json_object_put(l_jobj_datum);
+                    json_object_put(l_jobj_datums);
+                    json_object_put(l_obj_chain);
+                    dap_global_db_objs_delete(l_objs, l_objs_count);
+                    DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                    return;
+                }
+                json_object *l_jobj_addr_from = json_object_new_string(l_addr_from_str);
+                DAP_DELETE(l_addr_from_str);
+                if (!l_jobj_addr_from) {
+                    json_object_put(l_jobj_datum);
+                    json_object_put(l_jobj_datums);
+                    json_object_put(l_obj_chain);
+                    dap_global_db_objs_delete(l_objs, l_objs_count);
+                    DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                    return;
+                }
+                json_object_object_add(l_jobj_datum, "from", l_jobj_addr_from);
+                dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
+                json_object *l_jobj_to_list = json_object_new_array();
+                json_object *l_jobj_change_list = json_object_new_array();
+                json_object *l_jobj_fee_list = json_object_new_array();
+                if (!l_jobj_to_list || !l_jobj_change_list || !l_jobj_fee_list) {
+                    json_object_put(l_jobj_to_list);
+                    json_object_put(l_jobj_change_list);
+                    json_object_put(l_jobj_fee_list);
+                    json_object_put(l_jobj_datum);
+                    json_object_put(l_jobj_datums);
+                    json_object_put(l_obj_chain);
+                    dap_global_db_objs_delete(l_objs, l_objs_count);
+                    DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                    return;
+                }
+                for (dap_list_t *it = l_list_out_items; it; it = it->next) {
+                    dap_chain_addr_t *l_dist_addr = NULL;
+                    uint256_t l_value = uint256_0;
+                    const char *l_dist_token = NULL;
+                    uint8_t l_type = *(uint8_t*)it->data;
+                    switch (l_type) {
+                        case TX_ITEM_TYPE_OUT: {
+                            l_value = ((dap_chain_tx_out_t*)it->data)->header.value;
+                            l_dist_token = l_main_token;
+                            l_dist_addr = &((dap_chain_tx_out_t*)it->data)->addr;
+                        } break;
+                        case TX_ITEM_TYPE_OUT_EXT: {
+                            l_value = ((dap_chain_tx_out_ext_t*)it->data)->header.value;
+                            l_dist_token = ((dap_chain_tx_out_ext_t*)it->data)->token;
+                            l_dist_addr = &((dap_chain_tx_out_ext_t*)it->data)->addr;
+                        } break;
+                        case TX_ITEM_TYPE_OUT_COND: {
+                            l_value = ((dap_chain_tx_out_cond_t*)it->data)->header.value;
+                            if (((dap_chain_tx_out_cond_t*)it->data)->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) {
+                                l_dist_token = a_net->pub.native_ticker;
+                            }
+                        } break;
+                        default: break;
+                    }
+                    json_object *l_jobj_money = json_object_new_object();
+                    if (!l_jobj_money){
+                        json_object_put(l_jobj_to_list);
+                        json_object_put(l_jobj_change_list);
+                        json_object_put(l_jobj_fee_list);
+                        json_object_put(l_jobj_datum);
+                        json_object_put(l_jobj_datums);
+                        json_object_put(l_obj_chain);
+                        dap_global_db_objs_delete(l_objs, l_objs_count);
+                        return;
+                    }
+                    char *l_value_str = dap_chain_balance_print(l_value);
+                    if (!l_value_str) {
+                        json_object_put(l_jobj_to_list);
+                        json_object_put(l_jobj_change_list);
+                        json_object_put(l_jobj_fee_list);
+                        json_object_put(l_jobj_money);
+                        json_object_put(l_jobj_datum);
+                        json_object_put(l_jobj_datums);
+                        json_object_put(l_obj_chain);
+                        dap_global_db_objs_delete(l_objs, l_objs_count);
+                        return;
+                    }
+                    char *l_value_coins_str = dap_chain_balance_to_coins(l_value);
+                    if (!l_value_coins_str) {
+                        json_object_put(l_jobj_to_list);
+                        json_object_put(l_jobj_change_list);
+                        json_object_put(l_jobj_fee_list);
+                        DAP_DELETE(l_value_str);
+                        json_object_put(l_jobj_money);
+                        json_object_put(l_jobj_datum);
+                        json_object_put(l_jobj_datums);
+                        json_object_put(l_obj_chain);
+                        dap_global_db_objs_delete(l_objs, l_objs_count);
+                        return;
+                    }
+                    json_object *l_jobj_value = json_object_new_string(l_value_str);
+                    if (!l_jobj_value) {
+                        json_object_put(l_jobj_to_list);
+                        json_object_put(l_jobj_change_list);
+                        json_object_put(l_jobj_fee_list);
+                        DAP_DELETE(l_value_str);
+                        DAP_DELETE(l_value_coins_str);
+                        json_object_put(l_jobj_money);
+                        json_object_put(l_jobj_datum);
+                        json_object_put(l_jobj_datums);
+                        json_object_put(l_obj_chain);
+                        dap_global_db_objs_delete(l_objs, l_objs_count);
+                        return;
+                    }
+                    json_object_object_add(l_jobj_money, "value", l_jobj_value);
+                    json_object *l_jobj_value_coins = json_object_new_string(l_value_coins_str);
+                    if (!l_jobj_value_coins){
+                        json_object_put(l_jobj_to_list);
+                        json_object_put(l_jobj_change_list);
+                        json_object_put(l_jobj_fee_list);
+                        DAP_DELETE(l_value_str);
+                        DAP_DELETE(l_value_coins_str);
+                        json_object_put(l_jobj_money);
+                        json_object_put(l_jobj_datum);
+                        json_object_put(l_jobj_datums);
+                        json_object_put(l_obj_chain);
+                        dap_global_db_objs_delete(l_objs, l_objs_count);
+                        return;
+                    }
+                    json_object_object_add(l_jobj_money, "coins", l_jobj_value_coins);
+                    if (l_dist_token) {
+                        json_object *l_jobj_token = json_object_new_string(l_dist_token);
+                        if (!l_jobj_token) {
+                            json_object_put(l_jobj_to_list);
+                            json_object_put(l_jobj_change_list);
+                            json_object_put(l_jobj_fee_list);
+                            json_object_put(l_jobj_money);
+                            json_object_put(l_jobj_datum);
+                            json_object_put(l_jobj_datums);
+                            json_object_put(l_obj_chain);
+                            DAP_DELETE(l_value_str);
+                            DAP_DELETE(l_value_coins_str);
+                            dap_global_db_objs_delete(l_objs, l_objs_count);
+                            DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                            return;
                         }
-                        dap_chain_tx_sig_t *l_sig = l_list_sig_item->data;
-                        dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig(l_sig);
-                        dap_chain_addr_fill_from_sign(&l_addr_from, l_sign, a_net->pub.id);
-                        if (l_wallet_addr && dap_chain_addr_compare(l_wallet_addr, &l_addr_from)) {
-                            datum_is_accepted_addr = true;
+                        json_object_object_add(l_jobj_money, "token", l_jobj_token);
+                    }
+
+                    if (l_dist_addr) {
+                        char *l_addr_str = dap_chain_addr_to_str(l_dist_addr);
+                        if (!l_addr_str) {
+                            json_object_put(l_jobj_to_list);
+                            json_object_put(l_jobj_change_list);
+                            json_object_put(l_jobj_fee_list);
+                            DAP_DELETE(l_value_str);
+                            DAP_DELETE(l_value_coins_str);
+                            json_object_put(l_jobj_money);
+                            json_object_put(l_jobj_datum);
+                            json_object_put(l_jobj_datums);
+                            json_object_put(l_obj_chain);
+                            dap_global_db_objs_delete(l_objs, l_objs_count);
+                            return;
+                        }                    
+                        json_object *l_jobj_addr = json_object_new_string(l_addr_str);
+                        if (!l_jobj_addr) {
+                            json_object_put(l_jobj_to_list);
+                            json_object_put(l_jobj_change_list);
+                            json_object_put(l_jobj_fee_list);
+                            DAP_DELETE(l_value_str);
+                            DAP_DELETE(l_value_coins_str);
+                            DAP_DELETE(l_addr_str);
+                            json_object_put(l_jobj_money);
+                            json_object_put(l_jobj_datum);
+                            json_object_put(l_jobj_datums);
+                            json_object_put(l_obj_chain);
+                            dap_global_db_objs_delete(l_objs, l_objs_count);
+                            return;
                         }
-                        dap_list_free(l_list_sig_item);
-                        char *l_addr_from_str = dap_chain_addr_to_str(&l_addr_from);
-                        dap_list_t *l_list_in_reward = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_REWARD, NULL);
-                        if (l_list_in_reward) {
-                            dap_chain_tx_in_reward_t *l_in_reward = (dap_chain_tx_in_reward_t*)l_list_in_reward->data;
-                            char *l_block_hash = dap_chain_hash_fast_to_str_new(&l_in_reward->block_hash);
-                            dap_string_append_printf(a_str_tmp, "\tForm block reward: %s\n", l_block_hash);
-                            DAP_DELETE(l_block_hash);
-                        } else {
-                            dap_string_append_printf(a_str_tmp, "\tFrom: %s\n", l_addr_from_str);
+                        if (!datum_is_accepted_addr && l_wallet_addr) {
+                            datum_is_accepted_addr = dap_chain_addr_compare(l_wallet_addr, l_dist_addr);
                         }
-                        dap_list_free(l_list_in_reward);
-                        DAP_DELETE(l_addr_from_str);
-                        dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
-                        for (dap_list_t *it = l_list_out_items; it; it = it->next) {
-                            dap_chain_addr_t *l_dist_addr = NULL;
-                            uint256_t l_value = uint256_0;
-                            const char *l_dist_token = NULL;
-                            uint8_t l_type = *(uint8_t *) it->data;
-                            const char *l_type_out_str = "To";
-                            switch (l_type) {
-                                case TX_ITEM_TYPE_OUT: {
-                                    l_value = ((dap_chain_tx_out_t *) it->data)->header.value;
-                                    l_dist_token = l_main_token;
-                                    l_dist_addr = &((dap_chain_tx_out_t *) it->data)->addr;
-                                }
-                                    break;
-                                case TX_ITEM_TYPE_OUT_EXT: {
-                                    l_value = ((dap_chain_tx_out_ext_t *) it->data)->header.value;
-                                    l_dist_token = ((dap_chain_tx_out_ext_t *) it->data)->token;
-                                    l_dist_addr = &((dap_chain_tx_out_ext_t *) it->data)->addr;
-                                }
-                                    break;
-                                case TX_ITEM_TYPE_OUT_COND: {
-                                    dap_chain_tx_out_cond_t *l_out_cond = (dap_chain_tx_out_cond_t*)it->data;
-                                    l_value = ((dap_chain_tx_out_cond_t *) it->data)->header.value;
-                                    switch (l_out_cond->header.subtype) {
-                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: {
-                                            l_dist_token = a_net->pub.native_ticker;
-                                            l_type_out_str = "Fee";
-                                        } break;
-                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: {
-                                            l_dist_token = l_main_token;
-                                            l_dist_addr = NULL;
-                                            l_type_out_str = "Stake lock";
-                                        } break;
-                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: {
-                                            l_dist_token = l_main_token;
-                                            l_type_out_str = "xchange";
-                                        } break;
-                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: {
-                                            l_dist_token = l_main_token;
-                                            l_type_out_str = "Stake pos delegate";
-                                        } break;
-                                        case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: {
-                                            l_dist_token = l_main_token;
-                                            l_type_out_str = "Pay";
-                                        } break;
-                                        default:
-                                            break;
-                                    }
-                                }
-                                    break;
-                                default:
-                                    break;
-                            }
-                            char *l_value_str = dap_chain_balance_print(l_value);
-                            char *l_value_coins_str = dap_chain_balance_to_coins(l_value);
-                            if (!l_dist_addr) {
-                                dap_string_append_printf(a_str_tmp, "\t%s: %s (%s) %s\n", l_type_out_str,
-                                                         l_value_coins_str, l_value_str, l_dist_token);
-                            } else {
-                                char *l_addr_str = dap_chain_addr_to_str(l_dist_addr);
-                                if (!datum_is_accepted_addr && l_wallet_addr) {
-                                    datum_is_accepted_addr = dap_chain_addr_compare(l_wallet_addr, l_dist_addr);
-                                }
-                                dap_chain_addr_compare(&l_addr_from, l_dist_addr) ?
-                                dap_string_append_printf(a_str_tmp, "\tСhange: %s (%s) %s\n",
-                                                         l_value_coins_str, l_value_str, l_dist_token) :
-                                dap_string_append_printf(a_str_tmp, "\tTo: %s (%s) %s %s\n",
-                                                         l_value_coins_str, l_value_str, l_dist_token, l_addr_str);
-                                DAP_DELETE(l_addr_str);
-                            }
+                        json_object *l_jobj_f = json_object_new_object();
+                        if (!l_jobj_f) {
+                            json_object_put(l_jobj_to_list);
+                            json_object_put(l_jobj_change_list);
+                            json_object_put(l_jobj_fee_list);
                             DAP_DELETE(l_value_str);
                             DAP_DELETE(l_value_coins_str);
+                            DAP_DELETE(l_addr_str);
+                            json_object_put(l_jobj_addr);
+                            json_object_put(l_jobj_money);
+                            json_object_put(l_jobj_datum);
+                            json_object_put(l_jobj_datums);
+                            json_object_put(l_obj_chain);
+                            dap_global_db_objs_delete(l_objs, l_objs_count);
+                            return;
                         }
-                        dap_list_free(l_list_out_items);
-                    }
-                        break;
-                    case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-                        size_t l_emi_size = 0;
-                        dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_read(l_datum->data,
-                                                                                                &l_emi_size);
-                        if (l_wallet_addr && l_emi && dap_chain_addr_compare(l_wallet_addr, &l_emi->hdr.address))
-                            datum_is_accepted_addr = true;
-                        DAP_DELETE(l_emi);
-                        dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type, a_net->pub.id);
+                        json_object_object_add(l_jobj_f, "money", l_jobj_money);
+                        if (dap_chain_addr_compare(&l_addr_from, l_dist_addr)) {
+                            json_object_array_add(l_jobj_change_list, l_jobj_f);
+                        } else {
+                            json_object_object_add(l_jobj_f, "addr", l_jobj_addr);
+                            json_object_array_add(l_jobj_to_list, l_jobj_f);
+                        }
+                    
+                        DAP_DELETE(l_value_str);
+                        DAP_DELETE(l_value_coins_str);
+                        DAP_DELETE(l_addr_str);
+                    } else {
+                        json_object_array_add(l_jobj_fee_list, l_jobj_money);
                     }
-                        break;
-                    default:
-                        dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type, a_net->pub.id);
-                }
-                if (datum_is_accepted_addr) {
-                    l_objs_addr++;
                 }
-            }
+                json_object_object_add(l_jobj_datum, "to", l_jobj_to_list);
+                json_object_object_add(l_jobj_datum, "change", l_jobj_change_list);
+                json_object_object_add(l_jobj_datum, "fee", l_jobj_fee_list);
+                dap_list_free(l_list_out_items);
+            } break;
+            case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
+                size_t l_emi_size = 0;
+                dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_read(l_datum->data, &l_emi_size);
+                if (l_wallet_addr && l_emi && dap_chain_addr_compare(l_wallet_addr, &l_emi->hdr.address))
+                    datum_is_accepted_addr = true;
+                DAP_DELETE(l_emi);
+                json_object_object_add(l_jobj_datum, "data", dap_chain_datum_data_to_json(l_datum));
+            } break;
+            default:
+                json_object_object_add(l_jobj_datum, "data", dap_chain_datum_data_to_json(l_datum));
         }
-        if (l_wallet_addr) {
-            dap_string_append_printf(a_str_tmp, l_objs_addr ? "%s.%s: Total %zu records\n"
-                                                            : "%s.%s: No records\n", a_net->pub.name, a_chain->name,
-                                     l_objs_addr);
-        } else {
-            dap_string_append_printf(a_str_tmp, l_objs_count ? "%s.%s: Total %zu records\n"
-                                                             : "%s.%s: No records\n", a_net->pub.name, a_chain->name,
-                                     l_objs_count);
+        json_object_array_add(l_jobj_datums, l_jobj_datum);
+    }
+    dap_global_db_objs_delete(l_objs, l_objs_count);
+    json_object_object_add(l_obj_chain, "datums", l_jobj_datums);
+    if (a_add) {
+        json_object *l_ev_addr = json_object_new_int64(l_objs_count);
+        if (!l_ev_addr) {
+            json_object_put(l_obj_chain);
+            dap_json_rpc_allocation_error;
+            return;
         }
-        dap_global_db_objs_delete(l_objs, l_objs_count);
-        DAP_DELETE(l_gdb_group_mempool);
+        json_object_object_add(l_obj_chain, "number_elements_per_address", l_ev_addr);
     }
+    json_object_array_add(a_json_obj, l_obj_chain);
+    DAP_DELETE(l_gdb_group_mempool);
+}
+
+static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_hash_str, json_object **a_json_reply) {
+        char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
+        uint8_t *l_data_tmp = dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash_str,
+                                                     NULL, NULL, NULL);
+        if(l_data_tmp && dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash_str) == 0) {
+            char *l_msg_str = dap_strdup_printf("Datum %s deleted", a_datum_hash_str);
+            json_object *l_msg = json_object_new_string(l_msg_str);
+            DAP_DELETE(l_msg_str);
+            if (!l_msg) {
+                dap_json_rpc_allocation_error;
+                DAP_DELETE(l_gdb_group_mempool);
+                DAP_DELETE(l_data_tmp);
+                return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+            }
+            json_object_array_add(*a_json_reply, l_msg);
+            DAP_DELETE(l_gdb_group_mempool);
+            DAP_DELETE(l_data_tmp);
+            return 0;
+        } else {
+            DAP_DELETE(l_gdb_group_mempool);
+            DAP_DELETE(l_data_tmp);
+            return 1;
+        }
 }
 
+typedef enum cmd_mempool_delete_err_list{
+    COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND
+}cmd_mempool_delete_err_list_t;
 /**
  * @brief _cmd_mempool_delete
  * @param argc
@@ -2923,27 +3253,44 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
  * @param a_str_reply
  * @return
  */
-int _cmd_mempool_delete(dap_chain_t *a_chain, const char *a_datum_hash, char **a_str_reply)
+int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, void **reply)
 {
-    if (!a_chain || !a_datum_hash) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Chain or datum hash not specified");
-        return -1;
+    json_object ** a_json_reply = (json_object **) reply;
+    if (!a_net || !a_datum_hash) {
+        dap_json_rpc_error_add(COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT, "Net or datum hash not specified");
+        return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT;
     }
-    char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
-    uint8_t *l_data_tmp = dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash,
-                                                 NULL, NULL, NULL);
-    if(l_data_tmp && dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash) == 0) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s deleted", a_datum_hash);
-        DAP_DELETE(l_gdb_group_mempool);
-        DAP_DELETE(l_data_tmp);
-        return 0;
+    int res = 0;
+    if (!a_chain) {
+        dap_chain_t * l_chain;
+        DL_FOREACH(a_net->pub.chains, l_chain){
+            res = mempool_delete_for_chain(l_chain, a_datum_hash, a_json_reply);
+            if (res == 0) {
+                break;
+            }
+        }
     } else {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Can't find datum %s", a_datum_hash);
-        DAP_DELETE(l_gdb_group_mempool);
-        return -4;
+        res = mempool_delete_for_chain(a_chain, a_datum_hash, a_json_reply);
     }
+    if (res) {
+        char *l_msg_str = dap_strdup_printf("Error! Can't find datum %s", a_datum_hash);
+        if (!l_msg_str) {
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object *l_msg = json_object_new_string(l_msg_str);
+        DAP_DELETE(l_msg_str);
+        if (!l_msg) {
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object_array_add(*a_json_reply, l_msg);
+        return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND;
+    }
+    return 0;
 }
 
+
 /**
  * @brief s_com_mempool_check_datum_in_chain
  * @param a_chain
@@ -2960,6 +3307,14 @@ dap_chain_datum_t *s_com_mempool_check_datum_in_chain(dap_chain_t *a_chain, cons
     return (dap_chain_datum_t *)l_data_tmp;
 }
 
+typedef enum cmd_mempool_check_err_list {
+    COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_CHAIN = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET,
+    COM_MEMPOOL_CHECK_ERR_REQUIRES_DATUM_HASH,
+    COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR,
+    COM_MEMPOOL_CHECK_ERR_DATUM_NOT_FIND
+}cmd_mempool_check_err_list_t;
+
 /**
  * @brief _cmd_mempool_check
  * @param a_net
@@ -2969,46 +3324,45 @@ dap_chain_datum_t *s_com_mempool_check_datum_in_chain(dap_chain_t *a_chain, cons
  * @param a_str_reply
  * @return int
  */
-int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, char **a_str_reply) {
+int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char **a_hash_out_type, void ** reply) {
+    json_object ** a_json_reply = (json_object **) reply;
+
     if (!a_net || !a_datum_hash) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "The network or datum hash is not defined. It is "
-                                                       "impossible to determine the presence of this datum in the mempool.");
-        return -1;
+        dap_json_rpc_error_add(COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET, "Error! Both -net <network_name> "
+                                                                       "and -datum <data_hash> parameters are required.");
+        return COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET;
     }
     dap_chain_datum_t *l_datum = NULL;
+    char *l_chain_name = a_chain ? a_chain->name : NULL;
     bool l_found_in_chains = false;
-    /* For search in blockchain */
-    const char *l_chain_name = NULL;
-    int l_ret_code = -1;
-    char l_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
-    dap_hash_fast_t l_atom_hash;
-    /* ------------------------ */
-    if (!a_chain) {
-        dap_chain_t *l_chain = NULL;
-        DL_FOREACH(a_net->pub.chains, l_chain) {
-            l_datum = s_com_mempool_check_datum_in_chain(l_chain, a_datum_hash);
+    int l_ret_code = 0;
+    dap_hash_fast_t l_atom_hash = {};
+    if (a_chain)
+        l_datum = s_com_mempool_check_datum_in_chain(a_chain, a_datum_hash);
+    else {
+        dap_chain_t *it = NULL;
+        DL_FOREACH(a_net->pub.chains, it) {
+            l_datum = s_com_mempool_check_datum_in_chain(it, a_datum_hash);
             if (l_datum) {
-                l_chain_name = l_chain->name;
+                l_chain_name = it->name;
                 break;
             }
         }
-    } else {
-        l_datum = s_com_mempool_check_datum_in_chain(a_chain, a_datum_hash);
-        l_chain_name = a_chain->name;
     }
     if (!l_datum) {
         l_found_in_chains = true;
         dap_hash_fast_t l_datum_hash;
         if (dap_chain_hash_fast_from_hex_str(a_datum_hash, &l_datum_hash)) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Incorrect hash string %s", a_datum_hash);
-            return -4;
+            dap_json_rpc_error_add(COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR,
+                                    "Incorrect hash string %s", a_datum_hash);
+            return COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR;
         }
         if (a_chain)
-            l_datum = a_chain->callback_datum_find_by_hash ? a_chain->callback_datum_find_by_hash(a_chain, &l_datum_hash, &l_atom_hash, &l_ret_code) : NULL;
+            l_datum = a_chain->callback_datum_find_by_hash(a_chain, &l_datum_hash, &l_atom_hash, &l_ret_code);
         else {
             dap_chain_t *it = NULL;
             DL_FOREACH(a_net->pub.chains, it) {
-                l_datum = it->callback_datum_find_by_hash ? it->callback_datum_find_by_hash(it, &l_datum_hash, &l_atom_hash, &l_ret_code) : NULL;
+                l_datum = it->callback_datum_find_by_hash(it, &l_datum_hash, &l_atom_hash, &l_ret_code);
                 if (l_datum) {
                     l_chain_name = it->name;
                     break;
@@ -3016,29 +3370,101 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char
             }
         }
     }
+    json_object *l_jobj_datum = json_object_new_object();
+    json_object *l_datum_hash = json_object_new_string(a_datum_hash);
+    json_object *l_net_obj = json_object_new_string(a_net->pub.name);
+    if (!l_jobj_datum || !l_datum_hash || !l_net_obj){
+        json_object_put(l_jobj_datum);
+        json_object_put(l_datum_hash);
+        json_object_put(l_net_obj);
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+    }
+    json_object *l_chain_obj;
+    if(l_chain_name) {
+        l_chain_obj = json_object_new_string(l_chain_name);
+        if (!l_chain_obj) {
+            json_object_put(l_jobj_datum);
+            json_object_put(l_datum_hash);
+            json_object_put(l_net_obj);
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+    } else
+        l_chain_obj = json_object_new_null();
+    json_object_object_add(l_jobj_datum, "hash", l_datum_hash);
+    json_object_object_add(l_jobj_datum, "net", l_net_obj);
+    json_object_object_add(l_jobj_datum, "chain", l_chain_obj);
+    json_object *l_find_bool;
     if (l_datum) {
-        dap_string_t *l_str_reply = dap_string_new("");
-        dap_string_append_printf(l_str_reply, "Datum %s is present in %s.%s\n", a_datum_hash,
-                                 l_found_in_chains ? "chains" : "mempool", l_chain_name);
+        l_find_bool = json_object_new_boolean(TRUE);
+        json_object *l_find_chain_or_mempool = json_object_new_string(l_found_in_chains ? "chain" : "mempool");
+        if (!l_find_chain_or_mempool || !l_find_bool) {
+            json_object_put(l_find_chain_or_mempool);
+            json_object_put(l_find_bool);
+            json_object_put(l_jobj_datum);
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object_object_add(l_jobj_datum, "find", l_find_bool);
+        json_object_object_add(l_jobj_datum, "source", l_find_chain_or_mempool);
         if (l_found_in_chains) {
+            char l_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE];
             dap_chain_hash_fast_to_str(&l_atom_hash, l_atom_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
-            dap_string_append_printf(l_str_reply, "Atom hash is %s return code is %d (%s)\n",
-                                     l_atom_hash_str, l_ret_code, dap_ledger_tx_check_err_str(l_ret_code));
+            json_object *l_obj_atom = json_object_new_object();
+            json_object *l_jobj_atom_hash = json_object_new_string(l_atom_hash_str);
+            json_object *l_jobj_atom_err = json_object_new_string(dap_ledger_tx_check_err_str(l_ret_code));
+            if (!l_obj_atom || !l_jobj_atom_hash || !l_jobj_atom_err) {
+                json_object_put(l_jobj_datum);
+                json_object_put(l_obj_atom);
+                json_object_put(l_jobj_atom_hash);
+                json_object_put(l_jobj_atom_err);
+                dap_json_rpc_allocation_error;
+                return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+            }
+            json_object_object_add(l_obj_atom, "hash", l_jobj_atom_hash);
+            json_object_object_add(l_obj_atom, "err", l_jobj_atom_err);
+            json_object_object_add(l_jobj_datum, "atom", l_obj_atom);
+        }
+        json_object *l_datum_obj_inf = dap_chain_datum_to_json(l_datum);
+        if (!l_datum_obj_inf) {
+            if (!l_found_in_chains)
+                DAP_DELETE(l_datum);
+            json_object_put(l_jobj_datum);
+            dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON,
+                                    "Failed to serialize datum to JSON.");
+            return DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON;
         }
-        dap_chain_datum_dump(l_str_reply, l_datum, a_hash_out_type, a_net->pub.id);
         if (!l_found_in_chains)
             DAP_DELETE(l_datum);
-        *a_str_reply = l_str_reply->str;
-        dap_string_free(l_str_reply, false);
+        json_object_array_add(*a_json_reply, l_jobj_datum);
         return 0;
     } else {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find datum %s in %s.%s",
-                                          a_datum_hash, a_net->pub.name, a_chain ? a_chain->name : "");
-        return -4;
+        l_find_bool = json_object_new_boolean(TRUE);
+        if (!l_find_bool) {
+            json_object_put(l_jobj_datum);
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object_object_add(l_jobj_datum, "find", l_find_bool);
+        json_object_array_add(*a_json_reply, l_jobj_datum);
+        return COM_MEMPOOL_CHECK_ERR_DATUM_NOT_FIND;
     }
-    return 0;
 }
 
+typedef enum cmd_mempool_proc_list_error{
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_GET_DATUM_HASH_FROM_STR,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_FALSE_VERIFY,
+    DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL
+
+}cmd_mempool_proc_list_error_t;
+
 /**
  * @brief _cmd_mempool_proc
  * process mempool datum
@@ -3048,80 +3474,175 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char
  * @param a_str_reply
  * @return
  */
-int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, char **a_str_reply)
+int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, void **reply)
 {
+    // If full or light it doesnt work
     if(dap_chain_net_get_role(a_net).enums>= NODE_ROLE_FULL){
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Need master node role or higher for network %s "
-                                                       "to process this command", a_net->pub.name);
-        return -1;
+        dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL,
+                               "Need master node role or higher for network %s to process this command", a_net->pub.name);
+        return DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL;
     }
+
     int ret = 0;
     char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
-    dap_string_t * l_str_tmp = dap_string_new(NULL);
+    if (!l_gdb_group_mempool){
+        dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME,
+                               "Failed to get mempool group name on network %s", a_net->pub.name);
+        return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME;
+    }
     size_t l_datum_size=0;
 
     dap_chain_datum_t * l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash,
-                                                         &l_datum_size, NULL, NULL );
-
+                                                                             &l_datum_size, NULL, NULL );
     size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0;
     if (l_datum_size != l_datum_size2) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes",
-                                          a_datum_hash, l_datum_size2, l_datum_size);
+        dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes",
+                                            a_datum_hash, l_datum_size2, l_datum_size);
         DAP_DELETE(l_gdb_group_mempool);
-        return -8;
+        return DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD;
     }
     if (!l_datum) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Can't find datum %s", a_datum_hash);
+        dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM,
+                               "Error! Can't find datum %s", a_datum_hash);
         DAP_DELETE(l_gdb_group_mempool);
-        return -4;
+        return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM;
     }
     dap_hash_fast_t l_datum_hash, l_real_hash;
-    dap_chain_hash_fast_from_str(a_datum_hash, &l_datum_hash);
+    if (dap_chain_hash_fast_from_hex_str(a_datum_hash, &l_datum_hash)) {
+        dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM,
+                               "Error! Can't convert datum hash string %s to digital form",
+                               a_datum_hash);
+        DAP_DELETE(l_gdb_group_mempool);
+        return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM;
+    }
     dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_real_hash);
     if (!dap_hash_fast_compare(&l_datum_hash, &l_real_hash)) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Datum's real hash doesn't match datum's hash string %s",
-                                          a_datum_hash);
+        dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING,
+                               "Error! Datum's real hash doesn't match datum's hash string %s",
+                               a_datum_hash);
         DAP_DELETE(l_gdb_group_mempool);
-        return -6;
+        return DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING;
     }
     char buf[50];
     dap_time_t l_ts_create = (dap_time_t)l_datum->header.ts_create;
     const char *l_type = NULL;
     DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_type);
-    dap_string_append_printf(l_str_tmp, "hash %s: type_id=%s ts_create=%s data_size=%u\n",
-            a_datum_hash, l_type,
-            dap_ctime_r(&l_ts_create, buf), l_datum->header.data_size);
-    int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, l_datum, &l_datum_hash) ;
+    json_object *l_jobj_res = json_object_new_object();
+    json_object *l_jobj_datum = json_object_new_object();
+    json_object *l_jobj_hash = json_object_new_string(a_datum_hash);
+    json_object *l_jobj_type = json_object_new_string(l_type);
+    json_object *l_jobj_ts_created = json_object_new_object();
+    json_object *l_jobj_ts_created_time_stamp = json_object_new_uint64(l_ts_create);
+    char *l_ts_created_str = dap_ctime_r(&l_ts_create, buf);
+    if (!l_ts_created_str || !l_jobj_ts_created || !l_jobj_ts_created_time_stamp || !l_jobj_type ||
+        !l_jobj_hash || !l_jobj_datum || !l_jobj_res) {
+        json_object_put(l_jobj_res);
+        json_object_put(l_jobj_datum);
+        json_object_put(l_jobj_hash);
+        json_object_put(l_jobj_type);
+        json_object_put(l_jobj_ts_created);
+        json_object_put(l_jobj_ts_created_time_stamp);
+        DAP_DEL_Z(l_ts_created_str);
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+    }
+    json_object *l_jobj_ts_created_str = json_object_new_string(l_ts_created_str);
+    DAP_DEL_Z(l_ts_created_str);
+    json_object *l_jobj_data_size = json_object_new_uint64(l_datum->header.data_size);
+    if (!l_jobj_ts_created_str || !l_jobj_data_size) {
+        json_object_put(l_jobj_res);
+        json_object_put(l_jobj_datum);
+        json_object_put(l_jobj_hash);
+        json_object_put(l_jobj_type);
+        json_object_put(l_jobj_ts_created);
+        json_object_put(l_jobj_ts_created_time_stamp);
+        json_object_put(l_jobj_ts_created_str);
+        json_object_put(l_jobj_data_size);
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+    }
+    json_object_object_add(l_jobj_datum, "hash", l_jobj_hash);
+    json_object_object_add(l_jobj_datum, "type", l_jobj_type);
+    json_object_object_add(l_jobj_ts_created, "time_stamp", l_jobj_ts_created_time_stamp);
+    json_object_object_add(l_jobj_ts_created, "str", l_jobj_ts_created_str);
+    json_object_object_add(l_jobj_datum, "ts_created", l_jobj_ts_created);
+    json_object_object_add(l_jobj_datum, "data_size", l_jobj_data_size);
+    json_object_object_add(l_jobj_res, "datum", l_jobj_datum);
+    json_object *l_jobj_verify = json_object_new_object();
+    if (!l_jobj_verify) {
+        json_object_put(l_jobj_res);
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+    }
+    int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, l_datum, &l_datum_hash);
     if (l_verify_datum){
-        dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications (%s) examine node log files",
-                                 dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum));
-        ret = -9;
+        json_object *l_jobj_verify_err = json_object_new_string(dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum));
+        json_object *l_jobj_verify_status = json_object_new_boolean(FALSE);
+        if (!l_jobj_verify_status || !l_jobj_verify_err) {
+            json_object_put(l_jobj_verify_status);
+            json_object_put(l_jobj_verify_err);
+            json_object_put(l_jobj_verify);
+            json_object_put(l_jobj_res);
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status);
+        json_object_object_add(l_jobj_verify, "error", l_jobj_verify_err);
+        ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_FALSE_VERIFY;
     } else {
         if (a_chain->callback_add_datums) {
             if (a_chain->callback_add_datums(a_chain, &l_datum, 1) == 0) {
-                dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications, examine node log files");
-                ret = -6;
+                json_object *l_jobj_verify_status = json_object_new_boolean(FALSE);
+                if (!l_jobj_verify_status) {
+                    json_object_put(l_jobj_verify_status);
+                    json_object_put(l_jobj_verify);
+                    json_object_put(l_jobj_res);
+                    dap_json_rpc_allocation_error;
+                    return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                }
+                json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status);
+                ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_FALSE_VERIFY;
             } else {
-                dap_string_append_printf(l_str_tmp, "Datum processed well. ");
-                char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
+                json_object *l_jobj_verify_status = json_object_new_boolean(TRUE);
+                if (!l_jobj_verify_status) {
+                    json_object_put(l_jobj_verify);
+                    json_object_put(l_jobj_res);
+                    dap_json_rpc_allocation_error;
+                    return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                }
+                json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status);
                 if (dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash)){
-                    dap_string_append_printf(l_str_tmp, "Warning! Can't delete datum from mempool!");
-                } else
-                    dap_string_append_printf(l_str_tmp, "Removed datum from mempool.");
-                DAP_DELETE(l_gdb_group_mempool);
+                    json_object *l_jobj_wrn_text = json_object_new_string("Can't delete datum from mempool!");
+                    if (!l_jobj_wrn_text) {
+                        json_object_put(l_jobj_verify);
+                        json_object_put(l_jobj_res);
+                        dap_json_rpc_allocation_error;
+                        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                    }
+                    json_object_object_add(l_jobj_verify, "warning", l_jobj_wrn_text);
+                } else {
+                    json_object *l_jobj_text = json_object_new_string("Removed datum from mempool.");
+                    if (!l_jobj_text) {
+                        json_object_put(l_jobj_verify);
+                        json_object_put(l_jobj_res);
+                        dap_json_rpc_allocation_error;
+                        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                    }
+                    json_object_object_add(l_jobj_verify, "notice", l_jobj_text);
+                }
             }
         } else {
-            dap_string_append_printf(l_str_tmp, "Error! Can't move to no-concensus chains from mempool");
-            ret = -1;
+            dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL, "Error! Can't move to no-concensus chains from mempool");
+            ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL;
         }
     }
-    dap_string_append_printf(l_str_tmp, "\n");
-    dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str);
-    dap_string_free(l_str_tmp, true);
     DAP_DELETE(l_gdb_group_mempool);
+    json_object_object_add(l_jobj_res, "verify", l_jobj_verify);
+    json_object_array_add(*reply, l_jobj_res);
     return ret;
 }
 
+
 /**
  * @breif _cmd_mempool_proc_all
  * @param a_net
@@ -3129,25 +3650,255 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *
  * @param a_str_reply
  * @return
  */
-int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, char ** a_str_reply) {
+int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, void **reply) {
+    json_object ** a_json_reply = (json_object **) reply;
     if (!a_net || !a_chain) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "The net and chain argument is not set");
-        return -1;
+        dap_json_rpc_error_add(-2, "The net and chain argument is not set");
+        return -2;
+    }
+
+    json_object *l_ret = json_object_new_object();
+    if (!l_ret){
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
     }
     if(!dap_chain_net_by_id(a_chain->net_id)) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "%s.%s: chain not found\n", a_net->pub.name,
-                                          a_chain->name);
+        char *l_warn_str = dap_strdup_printf("%s.%s: chain not found\n", a_net->pub.name,
+                                             a_chain->name);
+        if (!l_warn_str) {
+            json_object_put(l_ret);
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object *l_warn_obj = json_object_new_string(l_warn_str);
+        DAP_DELETE(l_warn_str);
+        if (!l_warn_obj){
+            json_object_put(l_ret);
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object_object_add(l_ret, "warning", l_warn_obj);
     }
 
 #ifdef DAP_TPS_TEST
-    dap_ledger_set_tps_start_time(a_net->pub.ledger);
+    dap_chain_ledger_set_tps_start_time(a_net->pub.ledger);
 #endif
     dap_chain_node_mempool_process_all(a_chain, true);
-    dap_cli_server_cmd_set_reply_text(a_str_reply, "The entire mempool has been processed in %s.%s.",
-                                                   a_net->pub.name, a_chain->name);
+    char *l_str_result = dap_strdup_printf("The entire mempool has been processed in %s.%s.",
+                                           a_net->pub.name, a_chain->name);
+    if (!l_str_result) {
+        json_object_put(l_ret);
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+    }
+    json_object *l_obj_result = json_object_new_string(l_str_result);
+    DAP_DEL_Z(l_str_result);
+    if (!l_obj_result) {
+        json_object_put(l_ret);
+        dap_json_rpc_allocation_error;
+        return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+    }
+    json_object_object_add(l_ret, "result", l_obj_result);
+    json_object_array_add(*a_json_reply, l_obj_result);
+    return 0;
+}
+
+typedef enum _cmd_mempool_dump_error_list{
+    COM_DUMP_ERROR_LIST_CORRUPTED_SIZE = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    COM_DUMP_ERROR_CAN_NOT_FIND_DATUM,
+    COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION
+}_cmd_mempool_dump_error_list_t;
+
+int _cmd_mempool_dump_from_group(dap_chain_net_id_t a_net_id, const char *a_group_gdb, const char *a_datum_hash,
+                                 const char *a_hash_out_type, json_object **reply) {
+    size_t l_datum_size = 0;
+    dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(a_group_gdb, a_datum_hash,
+                                                         &l_datum_size, NULL, NULL );
+    size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0;
+    if (l_datum_size != l_datum_size2) {
+        dap_json_rpc_error_add(COM_DUMP_ERROR_LIST_CORRUPTED_SIZE, "Error! Corrupted datum %s, size by datum headers "
+                                                                   "is %zd when in mempool is only %zd bytes",
+                                 a_datum_hash, l_datum_size2, l_datum_size);
+        return COM_DUMP_ERROR_LIST_CORRUPTED_SIZE;
+    }
+    if (!l_datum) {
+        char *l_msg_str = dap_strdup_printf("Error! Can't find datum %s in %s", a_datum_hash, a_group_gdb);
+        if (!l_msg_str) {
+            DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+            return -1;
+        }
+        json_object *l_jobj_message = json_object_new_string(l_msg_str);
+        return COM_DUMP_ERROR_CAN_NOT_FIND_DATUM;
+    }
+    json_object *l_jobj_datum = dap_chain_datum_to_json(l_datum);
+    json_object_array_add(*reply, l_jobj_datum);
     return 0;
 }
 
+int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, json_object **reply) {
+    if (!a_net || !a_datum_hash || !a_hash_out_type) {
+        dap_json_rpc_error_add(COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION, "The following arguments are not set: network,"
+                                                                         " datum hash, and output hash type. "
+                                                                         "Functions required for operation.");
+        return COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION;
+    }
+    if (a_chain) {
+        char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
+        _cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, reply);
+        DAP_DELETE(l_group_mempool);
+    } else {
+        dap_chain_t *l_chain = NULL;
+        DL_FOREACH(a_net->pub.chains, l_chain){
+            char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
+            if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, reply)){
+                DAP_DELETE(l_group_mempool);
+                break;
+            }
+            DAP_DELETE(l_group_mempool);
+        }
+    }
+    return 0;
+}
+
+int com_mempool(int a_argc, char **a_argv, void **reply){
+    int arg_index = 1;
+    dap_chain_net_t *l_net = NULL;
+    dap_chain_t *l_chain = NULL;
+    const char *l_addr_b58 = NULL;
+    enum _subcmd {SUBCMD_LIST, SUBCMD_PROC, SUBCMD_PROC_ALL, SUBCMD_DELETE, SUBCMD_ADD_CA, SUBCMD_CHECK, SUBCMD_DUMP};
+    enum _subcmd l_cmd;
+    if (a_argv[1]) {
+        if (!dap_strcmp(a_argv[1], "list")) {
+            l_cmd = SUBCMD_LIST;
+        } else if (!dap_strcmp(a_argv[1], "proc")) {
+            l_cmd = SUBCMD_PROC;
+        } else if (!dap_strcmp(a_argv[1], "proc_all")) {
+            l_cmd = SUBCMD_PROC_ALL;
+        } else if (!dap_strcmp(a_argv[1], "delete")) {
+            l_cmd = SUBCMD_DELETE;
+        } else if (!dap_strcmp(a_argv[1], "add_ca")) {
+            l_cmd = SUBCMD_ADD_CA;
+        } else if (!dap_strcmp(a_argv[1], "dump")) {
+            l_cmd = SUBCMD_DUMP;
+        } else if (!dap_strcmp(a_argv[1], "check")) {
+            l_cmd = SUBCMD_CHECK;
+        } else {
+            char *l_str_err = dap_strdup_printf("Invalid sub command specified. Ыub command %s "
+                                                           "is not supported.", a_argv[1]);
+            if (!l_str_err) {
+                DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                return -1;
+            }
+            json_object *l_jobj_str_err = json_object_new_string(l_str_err);
+            DAP_DELETE(l_str_err);
+            if (!l_jobj_str_err) {
+                DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                return -1;
+            }
+            json_object_array_add(*reply, l_jobj_str_err);
+            return -2;
+        }
+    }
+    dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, a_argc, a_argv, &l_chain, &l_net);
+    const char *l_hash_out_type = "hex";
+    dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type);
+    const char *l_datum_hash_in = NULL;
+    const char *l_datum_hash = NULL;
+    dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_in);
+    if (l_datum_hash_in) {
+        if(dap_strncmp(l_datum_hash_in, "0x", 2) && dap_strncmp(l_datum_hash_in, "0X", 2)) {
+            l_datum_hash = dap_enc_base58_to_hex_str_from_str(l_datum_hash_in);
+        } else
+            l_datum_hash = dap_strdup(l_datum_hash_in);
+    }
+    int ret = -100;
+    switch (l_cmd) {
+        case SUBCMD_LIST: {
+            if (!l_net) {
+                dap_json_rpc_error_add(-5, "The command does not include the net parameter. Please specify the "
+                                           "parameter something like this mempool list -net <net_name>");
+                return -5;
+            }
+            json_object *obj_ret = json_object_new_object();
+            json_object *obj_net = json_object_new_string(l_net->pub.name);
+            if (!obj_ret || !obj_net) {
+                json_object_put(obj_ret);
+                json_object_put(obj_net);
+                DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                return -1;
+            }
+            json_object_object_add(obj_ret, "net", obj_net);
+            const char *l_wallet_addr = NULL;
+            if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_wallet_addr) && !l_wallet_addr) {
+                json_object *l_jobj_err = json_object_new_string("Parameter '-addr' require <addr>");
+                if (!l_jobj_err) {
+                    DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                    return -1;
+                }
+                json_object_array_add(*reply, l_jobj_err);
+                return -3;
+            }
+            json_object *l_jobj_chains = json_object_new_array();
+            if (!l_jobj_chains) {
+                json_object_put(obj_ret);
+                DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+                return -1;
+            }
+            if(l_chain) {
+                s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type);
+            } else {
+                DL_FOREACH(l_net->pub.chains, l_chain) {
+                    s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type);
+                }
+            }
+            json_object_object_add(obj_ret, "chains", l_jobj_chains);
+            json_object_array_add(*reply, obj_ret);
+            ret = 0;
+        } break;
+        case SUBCMD_PROC: {
+            ret = _cmd_mempool_proc(l_net, l_chain, l_datum_hash, reply);
+        } break;
+        case SUBCMD_PROC_ALL: {
+            ret = _cmd_mempool_proc_all(l_net, l_chain, reply);
+        } break;
+        case SUBCMD_DELETE: {
+            if (!l_chain) {
+                dap_json_rpc_error_add(-2, "The chain parameter was not specified or was specified incorrectly.");
+                ret = -2;
+            }
+            if (l_datum_hash) {
+                ret = _cmd_mempool_delete(l_net, l_chain, l_datum_hash, reply);
+            } else {
+                dap_json_rpc_error_add(-3, "Error! %s requires -datum <datum hash> option", a_argv[0]);
+                ret = -3;
+            }
+        } break;
+        case SUBCMD_ADD_CA: {
+            const char *l_ca_name  = NULL;
+            dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name);
+            if (!l_ca_name) {
+                dap_json_rpc_error_add(-3, "mempool add_ca requires parameter '-ca_name' to specify the certificate name");
+                ret = -3;
+            }
+            dap_cert_t *l_cert = dap_cert_find_by_name(l_ca_name);
+            if (!l_cert) {
+                dap_json_rpc_error_add(-4, "Cert with name '%s' not found.", l_ca_name);
+                ret = -4;
+            }
+            ret = _cmd_mempool_add_ca(l_net, l_chain, l_cert, reply);
+            DAP_DELETE(l_cert);
+        } break;
+        case SUBCMD_CHECK: {
+            ret = _cmd_mempool_check(l_net, l_chain, l_datum_hash, l_hash_out_type, reply);
+        } break;
+        case SUBCMD_DUMP: {
+            ret = _cmd_mempool_dump(l_net, l_chain, l_datum_hash, l_hash_out_type, reply);
+        } break;
+    }
+    DAP_DEL_Z(l_datum_hash);
+    return ret;
+}
+
 /**
  * @brief
  *
@@ -3542,8 +4293,9 @@ static int s_token_decl_check_params(int a_argc, char **a_argv, char **a_str_rep
     "\t -tx_sender_blocked <value>:\t Blocked tx sender(s)\n"
     "\n"
  */
-int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
+int com_token_decl(int a_argc, char ** a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     const char * l_ticker = NULL;
     uint256_t l_total_supply = {}; // 256
     uint16_t l_signs_emission = 0;
@@ -3878,8 +4630,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply)
     "\t -tx_sender_blocked_remove <value>:\t Remove tx sender(s) from blocked\n"
     "\n"
  */
-int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
+int com_token_update(int a_argc, char ** a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     const char * l_ticker = NULL;
     uint256_t l_total_supply = {}; // 256
     uint16_t l_signs_emission = 0;
@@ -4044,8 +4797,9 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply)
  * @param str_reply
  * @return
  */
-int com_token_emit(int a_argc, char **a_argv, char **a_str_reply)
+int com_token_emit(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
     const char *str_tmp = NULL;
     //const char *str_fee = NULL;
@@ -4242,8 +4996,9 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply)
  * @param a_str_reply
  * @return int
  */
-int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply)
+int com_tx_cond_create(int a_argc, char ** a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     (void) a_argc;
     int arg_index = 1;
     const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
@@ -4390,6 +5145,16 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply)
     return -1;
 }
 
+typedef enum cmd_mempool_add_ca_error_list{
+    COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET,
+    COM_MEMPOOL_ADD_CA_ERROR_REQUIRES_PARAMETER_CA_NAME,
+    COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_FIND_CERTIFICATE,
+    COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS,
+    COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA,
+    COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE,
+    COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_PLACE_CERTIFICATE
+}cmd_mempool_add_ca_error_list_t;
 /**
  * @brief _cmd_mempool_add_ca
  * @details Place public CA into the mempool
@@ -4399,286 +5164,112 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply)
  * @param a_str_reply
  * @return
  */
-int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, char **a_str_reply)
+int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void ** reply)
 {
-    if (!a_net)
-        return -1;
-    else if (a_str_reply && *a_str_reply) {
-        DAP_DELETE(*a_str_reply);
-        *a_str_reply = NULL;
+    json_object ** a_json_reply = (json_object **) reply;
+    if (!a_net || !a_chain || !a_cert){
+        dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND, "The network or certificate attribute was not passed.");
+        return COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND;
     }
-    dap_chain_t *l_chain = a_chain;
-
+    dap_chain_t *l_chain = NULL;
     // Chech for chain if was set or not
-    if (!l_chain){
+    if (!a_chain){
        // If wasn't set - trying to auto detect
         l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_CA);
         if (!l_chain) { // If can't auto detect
             // clean previous error code
-            dap_cli_server_cmd_set_reply_text(a_str_reply,
-                    "No chains for CA datum in network \"%s\"", a_net->pub.name );
-            return -2;
+            dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET,
+                                   "No chains for CA datum in network \"%s\"", a_net->pub.name);
+            return COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET;
         }
     }
-    if (!a_cert){
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "mempool_add_ca_public requires parameter '-ca_name' to specify the certificate name");
-        return -3;
-    }
     if(!a_cert->enc_key){
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "Corrupted certificate \"%s\" without keys certificate", a_cert->name);
-        return -5;
+        dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS,
+                               "Corrupted certificate \"%s\" without keys certificate", a_cert->name);
+        return COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS;
     }
 
     if (a_cert->enc_key->priv_key_data_size || a_cert->enc_key->priv_key_data){
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "Certificate \"%s\" has private key data. Please export public only key certificate without private keys", a_cert->name);
-        return -6;
+        dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA,
+                               "Certificate \"%s\" has private key data. Please export public only key certificate without private keys", a_cert->name);
+        return COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA;
     }
 
     // Serialize certificate into memory
     uint32_t l_cert_serialized_size = 0;
     byte_t * l_cert_serialized = dap_cert_mem_save(a_cert, &l_cert_serialized_size);
-    if (!l_cert_serialized){
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "Can't serialize in memory certificate \"%s\"", a_cert->name);
-        return -7;
+    if(!l_cert_serialized){
+        dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE,
+                               "Can't serialize in memory certificate \"%s\"", a_cert->name);
+        return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE;
     }
     // Now all the chechs passed, forming datum for mempool
     dap_chain_datum_t * l_datum = dap_chain_datum_create( DAP_CHAIN_DATUM_CA, l_cert_serialized , l_cert_serialized_size);
-    DAP_DELETE(l_cert_serialized);
+    DAP_DELETE( l_cert_serialized);
     if(!l_datum){
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "Can't produce datum from certificate \"%s\"", a_cert->name);
-        return -7;
+        dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE,
+                               "Can't produce datum from certificate \"%s\"", a_cert->name);
+        return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE;
     }
 
     // Finaly add datum to mempool
     char *l_hash_str = dap_chain_mempool_datum_add(l_datum, l_chain, "hex");
     DAP_DELETE(l_datum);
     if (l_hash_str) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "Datum %s was successfully placed to mempool", l_hash_str);
+        char *l_msg = dap_strdup_printf("Datum %s was successfully placed to mempool", l_hash_str);
+        if (!l_msg) {
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object *l_obj_message = json_object_new_string(l_msg);
+        DAP_DELETE(l_msg);
         DAP_DELETE(l_hash_str);
+        if (!l_obj_message) {
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object_array_add(*a_json_reply, l_obj_message);
         return 0;
     } else {
-        dap_cli_server_cmd_set_reply_text(a_str_reply,
-                "Can't place certificate \"%s\" to mempool", a_cert->name);
-        return -8;
-    }
-}
-
-/**
- * @brief _cmd_mempool_dump_from_group
- * @param a_net_id
- * @param a_group_gdb
- * @param a_datum_hash
- * @param a_hash_out_type
- * @param a_str_tmp
- * @return
- */
-int _cmd_mempool_dump_from_group(dap_chain_net_id_t a_net_id, const char *a_group_gdb, const char *a_datum_hash, const char *a_hash_out_type, dap_string_t *a_str_tmp) {
-    size_t l_datum_size = 0;
-    dap_chain_datum_t * l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(a_group_gdb, a_datum_hash,
-                                                         &l_datum_size, NULL, NULL );
-    size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0;
-    if (l_datum_size != l_datum_size2) {
-        dap_string_append_printf(a_str_tmp,"Error! Corrupted datum %s, size by datum headers "
-                                           "is %zd when in mempool is only %zd bytes",
-                                 a_datum_hash, l_datum_size2, l_datum_size);
-        return -101;
-    }
-    if (!l_datum) {
-        dap_string_append_printf(a_str_tmp, "Error! Can't find datum %s in %s", a_datum_hash, a_group_gdb);
-        return -102;
-    }
-    dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type, a_net_id);
-    return 0;
-}
-
-/**
- * @brief _cmd_mempool_dump
- * @param a_net
- * @param a_chain
- * @param a_datum_hash
- * @param a_hash_out_type
- * @param a_str_ret
- * @return
- */
-int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, dap_string_t *a_str_ret) {
-    if (!a_str_ret)
-        return -1;
-    if (!a_net || !a_datum_hash || !a_hash_out_type) {
-        return -2;
-    }
-    if (a_chain) {
-        char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
-        _cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_str_ret);
-        DAP_DELETE(l_group_mempool);
-    } else {
-        dap_chain_t *l_chain = NULL;
-        DL_FOREACH(a_net->pub.chains, l_chain){
-            char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain);
-            if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_str_ret)){
-                DAP_DELETE(l_group_mempool);
-                break;
-            }
-            DAP_DELETE(l_group_mempool);
+        char *l_msg = dap_strdup_printf("Can't place certificate \"%s\" to mempool", a_cert->name);
+        if (!l_msg) {
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
+        }
+        json_object *l_obj_msg = json_object_new_string(l_msg);
+        DAP_DELETE(l_msg);
+        if (!l_obj_msg) {
+            dap_json_rpc_allocation_error;
+            return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED;
         }
+        json_object_array_add(*a_json_reply, l_obj_msg);
+        return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_PLACE_CERTIFICATE;
     }
-    return 0;
 }
 
 /**
- * @brief com_mempool
+ * @brief com_chain_ca_copy
+ * @details copy public CA into the mempool
  * @param a_argc
  * @param a_argv
+ * @param a_arg_func
  * @param a_str_reply
  * @return
  */
-int com_mempool(int a_argc, char **a_argv,  char **a_str_reply){
-    int arg_index = 1;
-    dap_chain_net_t *l_net = NULL;
-    dap_chain_t *l_chain = NULL;
-    const char *l_addr_b58 = NULL;
-    enum _subcmd {SUBCMD_LIST, SUBCMD_PROC, SUBCMD_PROC_ALL, SUBCMD_DELETE, SUBCMD_ADD_CA, SUBCMD_CHECK, SUBCMD_DUMP, SUBCMD_COUNT};
-    enum _subcmd l_cmd = 0;
-    if (a_argv[1]) {
-        char *lts = a_argv[1];
-        if (!dap_strcmp(lts, "list")) {
-            l_cmd = SUBCMD_LIST;
-        } else if (!dap_strcmp(lts, "proc")) {
-            l_cmd = SUBCMD_PROC;
-        } else if (!dap_strcmp(lts, "proc_all")) {
-            l_cmd = SUBCMD_PROC_ALL;
-        } else if (!dap_strcmp(lts, "delete")) {
-            l_cmd = SUBCMD_DELETE;
-        } else if (!dap_strcmp(lts, "add_ca")) {
-            l_cmd = SUBCMD_ADD_CA;
-        } else if (!dap_strcmp(lts, "dump")) {
-            l_cmd = SUBCMD_DUMP;
-        } else if (!dap_strcmp(lts, "check")) {
-            l_cmd = SUBCMD_CHECK;
-        } else if (!dap_strcmp(lts, "count")) {
-            l_cmd = SUBCMD_COUNT;
-        } else {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid sub command specified. Ыub command %s "
-                                                           "is not supported.", lts);
-            return -1;
-        }
-    }
-    dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net);
-    if (!l_net) {
-        return -2;
-    }
-    const char *l_hash_out_type = "hex";
-    dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type);
-    const char *l_datum_hash_in = NULL;
-    const char *l_datum_hash = NULL;
-    dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_in);
-    if (l_datum_hash_in) {
-        if(dap_strncmp(l_datum_hash_in, "0x", 2) && dap_strncmp(l_datum_hash_in, "0X", 2)) {
-            l_datum_hash = dap_enc_base58_to_hex_str_from_str(l_datum_hash_in);
-        } else
-            l_datum_hash = dap_strdup(l_datum_hash_in);
-    }
-    int ret = -100;
-    switch (l_cmd) {
-        case SUBCMD_LIST: {
-            const char *l_wallet_addr = NULL;
-            if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_wallet_addr) && !l_wallet_addr) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Parameter '-addr' require <addr>");
-                ret = -1;
-                break;
-            }
-            bool l_fast = (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "-fast") != -1) ? true : false;
-            dap_string_t * l_str_tmp = dap_string_new(NULL);
-            if(l_chain)
-                s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_str_tmp, l_hash_out_type, l_fast);
-            else
-                DL_FOREACH(l_net->pub.chains, l_chain)
-                    s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_str_tmp, l_hash_out_type, l_fast);
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str);
-            dap_string_free(l_str_tmp, true);
-            ret = 0;
-        } break;
-        case SUBCMD_PROC: {
-            ret = _cmd_mempool_proc(l_net, l_chain, l_datum_hash, a_str_reply);
-        } break;
-        case SUBCMD_PROC_ALL: {
-            ret = _cmd_mempool_proc_all(l_net, l_chain, a_str_reply);
-        } break;
-        case SUBCMD_DELETE: {
-            if (!l_chain) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "The chain parameter was not specified or "
-                                                               "was specified incorrectly.");
-                ret = -2;
-            }
-            if (l_datum_hash) {
-                ret = _cmd_mempool_delete(l_chain, l_datum_hash, a_str_reply);
-            } else {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", a_argv[0]);
-                ret = -3;
-            }
-        } break;
-        case SUBCMD_ADD_CA: {
-            const char *l_ca_name  = NULL;
-            dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name);
-            if (!l_ca_name) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply,
-                                                  "mempool add_ca requires parameter '-ca_name' to specify the certificate name");
-                ret = -3;
-            }
-            dap_cert_t *l_cert = dap_cert_find_by_name(l_ca_name);
-            if (!l_cert) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "Cert with name '%s' not found.", l_ca_name);
-                ret = -4;
-            }
-            ret = _cmd_mempool_add_ca(l_net, l_chain, l_cert, a_str_reply);
-            DAP_DELETE(l_cert);
-        } break;
-        case SUBCMD_CHECK: {
-            ret = _cmd_mempool_check(l_net, l_chain, l_datum_hash, l_hash_out_type, a_str_reply);
-        } break;
-        case SUBCMD_DUMP: {
-            dap_string_t *l_str_ret = dap_string_new(NULL);
-            ret = _cmd_mempool_dump(l_net, l_chain, l_datum_hash, l_hash_out_type, l_str_ret);
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret->str);
-            dap_string_free(l_str_ret, true);
-        } break;
-        case SUBCMD_COUNT: {
-            char *l_mempool_group;
-            dap_string_t *l_str_ret = dap_string_new(NULL);
-            if (!l_chain) {
-                DL_FOREACH(l_net->pub.chains, l_chain) {
-                    l_mempool_group = dap_chain_net_get_gdb_group_mempool_new(l_chain);
-                    size_t l_objs_count = 0;
-                    dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_mempool_group, &l_objs_count);
-                    dap_global_db_objs_delete(l_objs, l_objs_count);
-                    DAP_DELETE(l_mempool_group);
-                    dap_string_append_printf(l_str_ret, "%zu records found in mempool %s.%s\n", l_objs_count,
-                                             l_net->pub.name, l_chain->name);
-                }
-            } else {
-                l_mempool_group = dap_chain_net_get_gdb_group_mempool_new(l_chain);
-                size_t l_objs_count = 0;
-                dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_mempool_group, &l_objs_count);
-                dap_global_db_objs_delete(l_objs, l_objs_count);
-                DAP_DELETE(l_mempool_group);
-                dap_string_append_printf(l_str_ret, "%zu records found in mempool %s.%s\n", l_objs_count,
-                                         l_net->pub.name, l_chain->name);
-            }
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret->str);
-            dap_string_free(l_str_ret, true);
-        } break;
-    }
-    DAP_DEL_Z(l_datum_hash);
+int com_chain_ca_copy( int a_argc,  char ** a_argv, void ** reply)
+{
+    int l_argc = a_argc + 1;
+    char **l_argv = DAP_NEW_Z_COUNT(char*, l_argc);
+    l_argv[0] = "mempool";
+    l_argv[1] = "add_ca";
+    for (int i = 1; i < a_argc; i++)
+        l_argv[i + 1] = a_argv[i];
+    int ret = com_mempool(l_argc, l_argv, reply);
+    DAP_DEL_Z(l_argv);
     return ret;
 }
 
 
-
 /**
  * @brief com_chain_ca_pub
  * @details place public CA into the mempool
@@ -4688,8 +5279,9 @@ int com_mempool(int a_argc, char **a_argv,  char **a_str_reply){
  * @param a_str_reply
  * @return
  */
-int com_chain_ca_pub( int a_argc,  char ** a_argv, char ** a_str_reply)
+int com_chain_ca_pub( int a_argc,  char ** a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
     // Read params
     const char * l_ca_name = NULL;
@@ -4767,6 +5359,7 @@ int com_chain_ca_pub( int a_argc,  char ** a_argv, char ** a_str_reply)
     }
 }
 
+
 static const char* s_json_get_text(struct json_object *a_json, const char *a_key)
 {
     if(!a_json || !a_key)
@@ -4896,8 +5489,9 @@ static dap_pkey_t* s_json_get_pkey(struct json_object *a_json)
  * @param str_reply
  * @return int
  */
-int com_tx_create_json(int a_argc, char ** a_argv, char **a_str_reply)
+int com_tx_create_json(int a_argc, char ** a_argv, void ** reply)
 {
+    char** a_str_reply = (char **) reply;
     int l_arg_index = 1;
     int l_err_code = 0;
     const char *l_net_name = NULL; // optional parameter
@@ -5545,8 +6139,9 @@ int com_tx_create_json(int a_argc, char ** a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_tx_create(int a_argc, char **a_argv, char **a_str_reply)
+int com_tx_create(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
 //    int cmd_num = 1;
 //    const char *value_str = NULL;
@@ -5801,8 +6396,9 @@ int com_tx_create(int a_argc, char **a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_tx_verify(int a_argc, char **a_argv, char **a_str_reply)
+int com_tx_verify(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     const char * l_tx_hash_str = NULL;
     dap_chain_net_t * l_net = NULL;
     dap_chain_t * l_chain = NULL;
@@ -5857,8 +6453,9 @@ int com_tx_verify(int a_argc, char **a_argv, char **a_str_reply)
  * @param a_str_reply
  * @return int
  */
-int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
+int com_tx_history(int a_argc, char ** a_argv, void ** reply)
 {
+    json_object ** json_arr_reply = (json_object **) reply;
     int arg_index = 1;
     const char *l_addr_base58 = NULL;
     const char *l_wallet_name = NULL;
@@ -5874,8 +6471,10 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
     if(!l_hash_out_type)
         l_hash_out_type = "hex";
     if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid parameter -H, valid values: -H <hex | base58>");
-        return -1;
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR,
+                                "Invalid parameter -H, valid values: -H <hex | base58>");
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR;
+
     }
 
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_base58);
@@ -5887,47 +6486,51 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
     bool l_is_tx_all = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-all", NULL);
 
     if (!l_addr_base58 && !l_wallet_name && !l_tx_hash_str && !l_is_tx_all) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-addr' or '-w' or '-tx'");
-        return -1;
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR,
+                                "tx_history requires parameter '-addr' or '-w' or '-tx'");
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR;
     }
 
     if (!l_net_str && !l_addr_base58&& !l_is_tx_all) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-net' or '-addr'");
-        return -2;
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR,
+                                "tx_history requires parameter '-net' or '-addr'");
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR;
     }
 
     dap_chain_hash_fast_t l_tx_hash;
-    if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash)) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "TX hash not recognized");
-        return -3;
+    if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) {
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR, "tx hash not recognized");
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR;
     }
     // Select chain network
     if (l_net_str) {
         l_net = dap_chain_net_by_name(l_net_str);
         if (!l_net) { // Can't find such network
-            dap_cli_server_cmd_set_reply_text(a_str_reply,
-                    "tx_history requires parameter '-net' to be valid chain network name");
-            return -3;
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR,
+                                    "tx_history requires parameter '-net' to be valid chain network name");
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR;
         }
     }
     // Get chain address
     dap_chain_addr_t *l_addr = NULL;
     if (l_addr_base58) {
         if (l_tx_hash_str) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Incomatible params '-addr' & '-tx'");
-            return -4;
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR,
+                                                        "Incompatible params '-addr' & '-tx'");
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR;
         }
         l_addr = dap_chain_addr_from_str(l_addr_base58);
         if (!l_addr) {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet address not recognized");
-            return -5;
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR,
+                                                        "Wallet address not recognized");
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR;
         }
         if (l_net) {
             if (l_net->pub.id.uint64 != l_addr->net_id.uint64) {
-                dap_cli_server_cmd_set_reply_text(a_str_reply,
-                                                  "Network ID with '-net' param and network ID with '-addr' param are different");
+                dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR,
+                                        "Network ID with '-net' param and network ID with '-addr' param are different");
                 DAP_DELETE(l_addr);
-                return -6;
+                return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR;
             }
         } else
             l_net = dap_chain_net_by_id(l_addr->net_id);
@@ -5941,27 +6544,28 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
             dap_chain_addr_t *l_addr_tmp = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id);
             if (l_addr) {
                 if (!dap_chain_addr_compare(l_addr, l_addr_tmp)) {
-                    dap_cli_server_cmd_set_reply_text(a_str_reply,
-                                                      "Address with '-addr' param and address with '-w' param are different");
+                    dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR,
+                                            "Address with '-addr' param and address with '-w' param are different");
                     DAP_DELETE(l_addr);
                     DAP_DELETE(l_addr_tmp);
-                    return -7;
+                    return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR;
                 }
                 DAP_DELETE(l_addr_tmp);
             } else
                 l_addr = l_addr_tmp;
             dap_chain_wallet_close(l_wallet);
         } else {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "The wallet %s is not activated or it doesn't exist", l_wallet_name);
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR,
+                                    "The wallet %s is not activated or it doesn't exist", l_wallet_name);
             DAP_DELETE(l_addr);
-            return -7;
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR;
         }
     }
     // Select chain, if any
     if (!l_net) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "Could not determine the network from which to "
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR, "Could not determine the network from which to "
                                                        "extract data for the tx_history command to work.");
-        return -9;
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR;
     }
     if (l_chain_str)
         l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str);
@@ -5969,83 +6573,59 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
         l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX);
 
     if(!l_chain) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s."
-                                                        " You can set default datum type in chain configuration file",
-                                          l_net_str);
-        return -8;
+        dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR,
+                                "tx_history requires parameter '-chain' to be valid chain name in chain net %s."
+                                " You can set default datum type in chain configuration file", l_net_str);
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR;
     }
-    char *l_str_out = NULL;
+    // response
+    json_object * json_obj_out = NULL;
     if (l_tx_hash_str) {
-        l_str_out = dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type);
+         // history tx hash
+        json_obj_out = dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type, l_net);
+        if (!json_obj_out) {
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR,
+                                    "something went wrong in tx_history");
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR;
+        }
     } else if (l_addr) {
-        l_str_out = dap_db_history_addr(l_addr, l_chain, l_hash_out_type);
+        // history addr and wallet
+        char *l_addr_str = dap_chain_addr_to_str(l_addr);
+        json_obj_out = dap_db_history_addr(l_addr, l_chain, l_hash_out_type, l_addr_str);
+        if (!json_obj_out) {
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR,
+                                    "something went wrong in tx_history");
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR;
+        }
     } else if (l_is_tx_all) {
-        dap_time_t l_time_T = dap_time_now();
-        char out[80] = {"\0"};
-        dap_time_to_str_rfc822(out,80, l_time_T);
-        log_it(L_DEBUG, "Start getting tx from chain: %s", out);
-        dap_ledger_t *l_ledger = l_net->pub.ledger;
-        dap_string_t *l_tx_all_str = dap_string_new("");
-        size_t l_tx_count = 0;
-        size_t l_tx_ledger_accepted = 0;
-        size_t l_tx_ledger_rejected = 0;
-        dap_chain_cell_t    *l_cell = NULL,
-                            *l_cell_tmp = NULL;
-        dap_chain_atom_iter_t *l_iter = NULL;
-        HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) {
-            l_iter = l_chain->callback_atom_iter_create(l_chain, l_cell->id, 0);
-            size_t l_atom_size = 0;
-            dap_chain_atom_ptr_t l_ptr = l_chain->callback_atom_iter_get_first(l_iter, &l_atom_size);
-            while (l_ptr && l_atom_size) {
-                size_t l_datums_count = 0;
-                dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count);
-                for (size_t i = 0; i < l_datums_count; i++) {
-                    if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) {
-                        l_tx_count++;
-                        dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datums[i]->data;
-                        dap_hash_fast_t l_ttx_hash = {0};
-                        dap_hash_fast(l_tx, l_datums[i]->header.data_size, &l_ttx_hash);
-                        const char *l_token_ticker = NULL;
-                        if ((l_token_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_ttx_hash))) {
-                            dap_string_append_printf(l_tx_all_str, "\t\t↓↓↓ Ledger accepted ↓↓↓\n");
-                            l_tx_ledger_accepted++;
-                        } else {
-                            l_token_ticker = s_tx_get_main_ticker(l_tx, l_net, NULL);
-                            dap_string_append_printf(l_tx_all_str, "\t\t↓↓↓ Ledger rejected ↓↓↓\n");
-                            l_tx_ledger_rejected++;
-                        }
-                        dap_chain_datum_dump_tx(l_tx, l_token_ticker, l_tx_all_str, l_hash_out_type, &l_ttx_hash, l_net->pub.id);
-                    }
-                }
-                DAP_DEL_Z(l_datums);
-                l_ptr = l_chain->callback_atom_iter_get_next(l_iter, &l_atom_size);
-            }
-            l_cell->chain->callback_atom_iter_delete(l_iter);
+        // history all
+        json_object * json_obj_summary = json_object_new_object();
+        if (!json_obj_summary) {
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_MEMORY_ERR;
+        }
+
+        json_object* json_arr_history_all = dap_db_history_tx_all(l_chain, l_net, l_hash_out_type, json_obj_summary);
+        if (!json_arr_history_all) {
+            dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR,
+                                    "something went wrong in tx_history");
+            return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR;
         }
-        l_time_T = dap_time_now();
-        dap_time_to_str_rfc822(out,80, l_time_T);
-        log_it(L_DEBUG, "END getting tx from chain: %s", out);
-        dap_string_append_printf(l_tx_all_str, "Chain %s in network %s contains %zu transactions.\n"
-                                               "Of which %zu were accepted into the ledger and %zu were rejected.\n",
-                                 l_net->pub.name, l_chain->name, l_tx_count, l_tx_ledger_accepted, l_tx_ledger_rejected);
 
-        l_str_out = l_str_out ? dap_strdup_printf("%s%s", l_str_out, dap_strdup(l_tx_all_str->str)) : dap_strdup(l_tx_all_str->str);
-        dap_string_free(l_tx_all_str, true);
+        json_object_array_add(*json_arr_reply, json_arr_history_all);
+        json_object_array_add(*json_arr_reply, json_obj_summary);
+        return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK;
     }
 
-    dap_string_t *l_str_ret = dap_string_new("");
-    if (l_addr) {
-        char *l_addr_str = dap_chain_addr_to_str(l_addr);
-        dap_string_append_printf(l_str_ret, "%sHistory for addr %s:\n%s", l_sign_str, l_addr_str, l_str_out ? l_str_out : " empty");
-        DAP_DELETE(l_addr_str);
-        DAP_DELETE(l_str_out);
-    } else
-        dap_string_append_printf(l_str_ret, "%s", l_str_out);
-    dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret->str);
-    dap_string_free(l_str_ret, true);
-    return 0;
+    if (json_obj_out) {
+        json_object_array_add(*json_arr_reply, json_obj_out);
+    } else {
+        json_object_array_add(*json_arr_reply, json_object_new_string("empty"));
+    }
+
+    return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK;
 }
 
+
 /**
  * @brief stats command
  *
@@ -6055,8 +6635,9 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_stats(int argc, char **a_argv, char **a_str_reply)
+int com_stats(int argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         CMD_NONE, CMD_STATS_CPU
     };
@@ -6113,8 +6694,9 @@ int com_stats(int argc, char **a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_exit(int a_argc, char **a_argv, char **a_str_reply)
+int com_exit(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     UNUSED(a_argc);
     UNUSED(a_argv);
     UNUSED(a_str_reply);
@@ -6133,8 +6715,9 @@ int com_exit(int a_argc, char **a_argv, char **a_str_reply)
  * @param str_reply
  * @return int
  */
-int com_print_log(int a_argc, char **a_argv, char **a_str_reply)
+int com_print_log(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
     const char * l_str_ts_after = NULL;
     const char * l_str_limit = NULL;
@@ -6175,8 +6758,9 @@ int com_print_log(int a_argc, char **a_argv, char **a_str_reply)
  * @param a_str_reply
  * @return
  */
-int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply)
+int cmd_gdb_export(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
     const char *l_filename = NULL;
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "filename", &l_filename);
@@ -6282,8 +6866,9 @@ int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply)
  * @param a_str_reply
  * @return
  */
-int cmd_gdb_import(int a_argc, char **a_argv, char ** a_str_reply)
+int cmd_gdb_import(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     int arg_index = 1;
     const char *l_filename = NULL;
     dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "filename", &l_filename);
@@ -6385,8 +6970,9 @@ typedef struct _pvt_net_aliases_list{
     size_t count_nodes;
 }_pvt_net_aliases_list_t;
 
-int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply)
+int cmd_remove(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     //default init
     const char		*return_message	=	NULL;
     const char		*l_gdb_path		=	NULL;
@@ -6560,8 +7146,9 @@ struct opts {
 
 #define BUILD_BUG(condition) ((void)sizeof(char[1-2*!!(condition)]))
 
-int com_signer(int a_argc, char **a_argv, char **a_str_reply)
+int com_signer(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         CMD_NONE, CMD_SIGN, CMD_CHECK
     };
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index 76f7603378451d6009b73e537fc25c7fbdd2b83a..1dc83f5d40ebe2143d65d27b04238200dd79c76f 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -46,6 +46,9 @@
 #include "dap_chain_mempool.h"
 #include "dap_math_convert.h"
 
+#include "dap_json_rpc_errors.h"
+#include "dap_json_rpc_chain_datum_tx.h"
+
 #define LOG_TAG "chain_node_cli_cmd_tx"
 
 #include "uthash.h"
@@ -60,18 +63,13 @@ typedef struct dap_tx_data {
     dap_chain_addr_t addr;
 } dap_tx_data_t;
 
-typedef struct dap_chain_tx_hash_processed_ht{
-    dap_chain_hash_fast_t hash;
-    UT_hash_handle hh;
-}dap_chain_tx_hash_processed_ht_t;
-
 
 /**
  * @brief s_chain_tx_hash_processed_ht_free
  * free l_current_hash->hash, l_current_hash, l_hash_processed
  * @param l_hash_processed dap_chain_tx_hash_processed_ht_t
  */
-static void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed)
+void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed)
 {
     if (!l_hash_processed || !*l_hash_processed)
         return;
@@ -135,51 +133,96 @@ static bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum,
     return true;
 }
 
-/**
- * @brief dap_db_history_tx
- * Get data according the history log
- *
- * return history string
- * @param a_tx_hash
- * @param a_chain
- * @param a_hash_out_type
- * @return char*
- */
-char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type)
+json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash,
+                                        dap_hash_fast_t * l_atom_hash,
+                                        dap_chain_datum_tx_t * l_tx,
+                                        dap_chain_t * a_chain, 
+                                        const char *a_hash_out_type, 
+                                        dap_chain_net_t * l_net,
+                                        int l_ret_code,
+                                        bool *accepted_tx)
+{
+    const char *l_tx_token_ticker = NULL;
+    json_object* json_obj_datum = json_object_new_object();
+    if (!json_obj_datum) {
+        return NULL;
+    }
+
+    dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger;
+    l_tx_token_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_ledger, a_tx_hash);
+    if (l_tx_token_ticker) {
+        json_object_object_add(json_obj_datum, "status", json_object_new_string("ACCEPTED"));
+        *accepted_tx = true;
+    } else {
+        json_object_object_add(json_obj_datum, "status", json_object_new_string("DECLINED"));
+        *accepted_tx = false;
+    }
+
+    if (l_atom_hash) {
+        char *l_atom_hash_str = dap_strcmp(a_hash_out_type, "hex")
+                            ? dap_enc_base58_encode_hash_to_str(l_atom_hash)
+                            : dap_chain_hash_fast_to_str_new(l_atom_hash);
+        json_object_object_add(json_obj_datum, "atom_hash", json_object_new_string(l_atom_hash_str));
+    }
+
+    char *l_hash_str = dap_strcmp(a_hash_out_type, "hex")
+                        ? dap_enc_base58_encode_hash_to_str(a_tx_hash)
+                        : dap_chain_hash_fast_to_str_new(a_tx_hash);
+    json_object_object_add(json_obj_datum, "hash", json_object_new_string(l_hash_str));
+
+    json_object_object_add(json_obj_datum, "token_ticker", l_tx_token_ticker ? json_object_new_string(l_tx_token_ticker) 
+                                                                             : json_object_new_null());
+
+    json_object_object_add(json_obj_datum, "ret_code", json_object_new_int(l_ret_code));
+    json_object_object_add(json_obj_datum, "ret_code_str", json_object_new_string(dap_ledger_tx_check_err_str(l_ret_code)));
+
+    char l_time_str[32];
+    if (l_tx->header.ts_created) {
+        uint64_t l_ts = l_tx->header.ts_created;
+        dap_ctime_r(&l_ts, l_time_str);                             /* Convert ts to  "Sat May 17 01:17:08 2014\n" */
+        l_time_str[strlen(l_time_str)-1] = '\0';                    /* Remove "\n"*/
+    }
+    json_object *l_obj_ts_created = json_object_new_string(l_time_str);
+    json_object_object_add(json_obj_datum, "tx_created", l_obj_ts_created);
+
+    json_object* datum_tx = dap_chain_datum_tx_to_json(l_tx);
+    json_object_object_add(json_obj_datum, "items", datum_tx);
+
+    return json_obj_datum;
+}
+
+json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, 
+                      dap_chain_t * a_chain, 
+                      const char *a_hash_out_type,
+                      dap_chain_net_t * l_net)
+
 {
     if (!a_chain->callback_datum_find_by_hash) {
         log_it(L_WARNING, "Not defined callback_datum_find_by_hash for chain \"%s\"", a_chain->name);
         return NULL;
     }
 
-    dap_string_t *l_str_out = dap_string_new(NULL);
-    dap_hash_fast_t l_atom_hash = {};
     int l_ret_code = 0;
+    bool accepted_tx;
+    dap_hash_fast_t l_atom_hash = {0};
+    //search tx
     dap_chain_datum_t *l_datum = a_chain->callback_datum_find_by_hash(a_chain, a_tx_hash, &l_atom_hash, &l_ret_code);
     dap_chain_datum_tx_t *l_tx = l_datum  && l_datum->header.type_id == DAP_CHAIN_DATUM_TX ?
                                  (dap_chain_datum_tx_t *)l_datum->data : NULL;
 
     if (l_tx) {
-        char *l_atom_hash_str = dap_strcmp(a_hash_out_type, "hex")
-                ? dap_enc_base58_encode_hash_to_str(&l_atom_hash)
-                : dap_chain_hash_fast_to_str_new(&l_atom_hash);
-        dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger;
-        const char *l_tx_token_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_ledger, a_tx_hash);
-        dap_string_append_printf(l_str_out, "%s TX with atom %s (ret_code %d - %s)\n", l_tx_token_ticker ? "ACCEPTED" : "DECLINED",
-                                                                    l_atom_hash_str, l_ret_code, dap_ledger_tx_check_err_str(l_ret_code));
-        DAP_DELETE(l_atom_hash_str);
-        dap_chain_datum_dump_tx(l_tx, l_tx_token_ticker, l_str_out, a_hash_out_type, a_tx_hash, a_chain->net_id);
+        return dap_db_tx_history_to_json(a_tx_hash, &l_atom_hash,l_tx, a_chain, a_hash_out_type, l_net, l_ret_code, &accepted_tx);
     } else {
         char *l_tx_hash_str = dap_strcmp(a_hash_out_type, "hex")
                 ? dap_enc_base58_encode_hash_to_str(a_tx_hash)
                 : dap_chain_hash_fast_to_str_new(a_tx_hash);
-        dap_string_append_printf(l_str_out, "TX hash %s not founds in chains", l_tx_hash_str);
+        dap_json_rpc_error_add(-1, "TX hash %s not founds in chains", l_tx_hash_str);
         DAP_DELETE(l_tx_hash_str);
+        return NULL;
     }
-    return l_str_out ? dap_string_free(l_str_out, false) : NULL;
 }
 
-static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_processed_ht_t **a_tx_data_ht,
+static void s_tx_header_print(json_object* json_obj_datum, dap_chain_tx_hash_processed_ht_t **a_tx_data_ht,
                               dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_atom_hash,
                               const char *a_hash_out_type, dap_ledger_t *a_ledger,
                               dap_chain_hash_fast_t *a_tx_hash, int a_ret_code)
@@ -189,7 +232,8 @@ static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_process
     char l_time_str[32] = "unknown";                                /* Prefill string */
     if (a_tx->header.ts_created) {
         uint64_t l_ts = a_tx->header.ts_created;
-        dap_ctime_r(&l_ts, l_time_str);                             /* Convert ts to  Sat May 17 01:17:08 2014 */
+        dap_ctime_r(&l_ts, l_time_str);                             /* Convert ts to  "Sat May 17 01:17:08 2014\n" */
+        l_time_str[strlen(l_time_str)-1] = '\0';                    /* Remove "\n"*/
     }
     dap_chain_tx_hash_processed_ht_t *l_tx_data = NULL;
     HASH_FIND(hh, *a_tx_data_ht, a_tx_hash, sizeof(*a_tx_hash), l_tx_data);
@@ -215,16 +259,18 @@ static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_process
         l_tx_hash_str = dap_enc_base58_encode_hash_to_str(a_tx_hash);
         l_atom_hash_str = dap_enc_base58_encode_hash_to_str(a_atom_hash);
     }
-    char *l_err_code_str = l_declined ? dap_strdup_printf(" (ret code %d - %s)",
-                                                          a_ret_code, dap_ledger_tx_check_err_str(a_ret_code)) : "";
-    dap_string_append_printf(a_str_out, "%s TX hash %s with atom %s%s\n\t%s", l_declined ? "DECLINED" : "ACCEPTED",
-                                                                          l_tx_hash_str, l_atom_hash_str, l_err_code_str, l_time_str);
-    if (l_declined)
-        DAP_DEL_Z(l_err_code_str);
+    json_object_object_add(json_obj_datum, "status", json_object_new_string(l_declined ? "DECLINED" : "ACCEPTED"));
+    json_object_object_add(json_obj_datum, "hash", json_object_new_string(l_tx_hash_str));
+    json_object_object_add(json_obj_datum, "atom_hash", json_object_new_string(l_atom_hash_str));
+    json_object_object_add(json_obj_datum, "ret_code", json_object_new_int(a_ret_code));
+    json_object_object_add(json_obj_datum, "ret_code_str", json_object_new_string(dap_ledger_tx_check_err_str(a_ret_code)));
+    json_object_object_add(json_obj_datum, "tx_created", json_object_new_string(l_time_str));
+
     DAP_DELETE(l_tx_hash_str);
     DAP_DELETE(l_atom_hash_str);
 }
 
+
 /**
  * @brief dap_db_history_addr
  * Get data according the history log
@@ -235,28 +281,40 @@ static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_process
  * @param a_hash_out_type
  * @return char*
  */
-char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const char *a_hash_out_type)
+json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, 
+                                 const char *a_hash_out_type, const char * l_addr_str)
 {
     struct token_addr {
         const char token[DAP_CHAIN_TICKER_SIZE_MAX];
         dap_chain_addr_t addr;
     };
 
-    dap_string_t *l_str_out = dap_string_new(NULL);
-    if (!l_str_out) {
+    json_object* json_obj_datum = json_object_new_array();
+    if (!json_obj_datum){
         log_it(L_CRITICAL, "Memory allocation error");
+        dap_json_rpc_error_add(-44, "Memory allocation error");
         return NULL;
     }
+
+    // add address
+    json_object * json_obj_addr = json_object_new_object();
+    json_object_object_add(json_obj_addr, "address", json_object_new_string(l_addr_str));
+    json_object_array_add(json_obj_datum, json_obj_addr);
+
     dap_chain_tx_hash_processed_ht_t *l_tx_data_ht = NULL;
     dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id);
     if (!l_net) {
         log_it(L_WARNING, "Can't find net by specified chain %s", a_chain->name);
+        dap_json_rpc_error_add(-1, "Can't find net by specified chain %s", a_chain->name);
+        json_object_put(json_obj_datum);
         return NULL;
     }
     dap_ledger_t *l_ledger = l_net->pub.ledger;
     const char *l_native_ticker = l_net->pub.native_ticker;
     if (!a_chain->callback_datum_iter_create) {
         log_it(L_WARNING, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name);
+        dap_json_rpc_error_add(-1, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name);
+        json_object_put(json_obj_datum);
         return NULL;
     }
     // load transactions
@@ -345,6 +403,14 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
         bool l_header_printed = false;
         uint256_t l_fee_sum = {};
         dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL);
+        json_object * j_arr_data = json_object_new_array();
+        json_object * j_obj_tx = json_object_new_object();
+        if (!j_obj_tx || !j_arr_data) {
+            dap_json_rpc_allocation_error;
+            json_object_put(j_obj_tx);
+            json_object_put(j_arr_data);
+            return NULL;
+        }
         for (dap_list_t *it = l_list_out_items; it; it = it->next) {
             dap_chain_addr_t *l_dst_addr = NULL;
             uint8_t l_type = *(uint8_t *)it->data;
@@ -364,7 +430,7 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
             case TX_ITEM_TYPE_OUT_COND:
                 l_value = ((dap_chain_tx_out_cond_t *)it->data)->header.value;
                 if (((dap_chain_tx_out_cond_t *)it->data)->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) {
-                    l_fee_sum = ((dap_chain_tx_out_cond_t *)it->data)->header.value;
+                    SUM_256_256(l_fee_sum, ((dap_chain_tx_out_cond_t *)it->data)->header.value, &l_fee_sum);
                     l_dst_token = l_native_ticker;
                 } else
                     l_dst_token = l_src_token;
@@ -376,8 +442,9 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
                 continue;   // sent to self (coinback)
             if (l_src_addr && dap_chain_addr_compare(l_src_addr, a_addr) &&
                     dap_strcmp(l_dst_token, l_noaddr_token)) {
+
                 if (!l_header_printed) {
-                    s_tx_header_print(l_str_out, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash,
+                    s_tx_header_print(j_obj_tx, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash,
                                       a_hash_out_type, l_ledger, &l_tx_hash, l_datum_iter->ret_code);
                     l_header_printed = true;
                 }
@@ -386,11 +453,21 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
                                                               ((dap_chain_tx_out_cond_t *)it->data)->header.subtype);
                 char *l_value_str = dap_chain_balance_print(l_value);
                 char *l_coins_str = dap_chain_balance_to_coins(l_value);
-                dap_string_append_printf(l_str_out, "\tsend %s (%s) %s to %s\n",
-                                         l_coins_str,
-                                         l_value_str,
-                                         l_dst_token ? l_dst_token : "UNKNOWN",
-                                         l_dst_addr_str);
+                json_object * j_obj_data = json_object_new_object();
+                if (!j_obj_data) {
+                    dap_json_rpc_allocation_error;
+                    json_object_put(j_arr_data);
+                    json_object_put(j_obj_tx);
+                    return NULL;
+                }
+                json_object_object_add(j_obj_data, "tx_type", json_object_new_string("send"));
+                json_object_object_add(j_obj_data, "send_coins", json_object_new_string(l_coins_str));
+                json_object_object_add(j_obj_data, "send_datoshi", json_object_new_string(l_value_str));
+                json_object_object_add(j_obj_data, "token", l_dst_token ? json_object_new_string(l_dst_token) 
+                                                                            : json_object_new_string("UNKNOWN"));
+                json_object_object_add(j_obj_data, "destination_address", json_object_new_string(l_dst_addr_str));
+
+                json_object_array_add(j_arr_data, j_obj_data);
                 if (l_dst_addr)
                     DAP_DELETE(l_dst_addr_str);
                 DAP_DELETE(l_value_str);
@@ -398,7 +475,7 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
             }
             if (l_dst_addr && dap_chain_addr_compare(l_dst_addr, a_addr)) {
                 if (!l_header_printed) {
-                    s_tx_header_print(l_str_out, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash,
+                    s_tx_header_print(j_obj_tx, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash,
                                       a_hash_out_type, l_ledger, &l_tx_hash, l_datum_iter->ret_code);
                     l_header_printed = true;
                 }
@@ -411,36 +488,118 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const
                     l_src_str = dap_chain_tx_out_cond_subtype_to_str(l_src_subtype);
                 char *l_value_str = dap_chain_balance_print(l_value);
                 char *l_coins_str = dap_chain_balance_to_coins(l_value);
-                dap_string_append_printf(l_str_out, "\trecv %s (%s) %s from %s\n",
-                                         l_coins_str,
-                                         l_value_str,
-                                         l_dst_token ? l_dst_token : "UNKNOWN",
-                                         l_src_str);
+                json_object * j_obj_data = json_object_new_object();
+                if (!j_obj_data) {
+                    dap_json_rpc_allocation_error;
+                    json_object_put(j_arr_data);
+                    json_object_put(j_obj_tx);
+                    return NULL;
+                }
+                json_object_object_add(j_obj_data, "tx_type", json_object_new_string("recv"));
+                json_object_object_add(j_obj_data, "recv_coins", json_object_new_string(l_coins_str));
+                json_object_object_add(j_obj_data, "recv_datoshi", json_object_new_string(l_value_str));
+                json_object_object_add(j_obj_data, "token", l_dst_token ? json_object_new_string(l_dst_token) 
+                                                                            : json_object_new_string("UNKNOWN"));
+                json_object_object_add(j_obj_data, "source_address", json_object_new_string(l_src_str));
+                json_object_array_add(j_arr_data, j_obj_data);
                 DAP_DEL_Z(l_src_addr_str);
                 DAP_DELETE(l_value_str);
                 DAP_DELETE(l_coins_str);
             }
         }
+        if (json_object_array_length(j_arr_data) > 0) {
+            json_object_object_add(j_obj_tx, "data", j_arr_data);
+        }
         dap_list_free(l_list_out_items);
         // fee for base TX in native token
-        if (l_header_printed &&
-                (l_base_tx || !dap_strcmp(l_native_ticker, l_noaddr_token)) &&
-                !dap_strcmp(l_native_ticker, l_src_token)) {
+        if (l_header_printed && l_base_tx && !dap_strcmp(l_native_ticker, l_src_token)) {
+            json_object * j_obj_fee = json_object_new_object();
+            json_object * j_arr_fee = json_object_new_array();
+            if (!j_arr_fee || !j_obj_fee) {
+                dap_json_rpc_allocation_error;
+                json_object_put(j_arr_data);
+                json_object_put(j_obj_tx);
+                return NULL;
+            }
             char *l_fee_value_str = dap_chain_balance_print(l_fee_sum);
             char *l_fee_coins_str = dap_chain_balance_to_coins(l_fee_sum);
-            dap_string_append_printf(l_str_out, "\tpay %s (%s) fee\n",
-                                               l_fee_value_str, l_fee_coins_str);
+            json_object_object_add(j_obj_fee, "fee", json_object_new_string(l_fee_coins_str));;
+            json_object_object_add(j_obj_fee, "fee_datoshi", json_object_new_string(l_fee_value_str));
+            json_object_array_add(j_arr_fee, j_obj_fee);
+            json_object_object_add(j_obj_tx, "fee", j_arr_fee);
             DAP_DELETE(l_fee_value_str);
             DAP_DELETE(l_fee_coins_str);
         }
+        if (json_object_object_length(j_obj_tx) > 0) {
+            json_object_array_add(json_obj_datum, j_obj_tx);
+        }
     }
     a_chain->callback_datum_iter_delete(l_datum_iter);
     // delete hashes
     s_dap_chain_tx_hash_processed_ht_free(&l_tx_data_ht);
     // if no history
-    if(!l_str_out->len)
-        dap_string_append(l_str_out, "\tempty");
-    return l_str_out ? dap_string_free(l_str_out, false) : NULL;
+    if (json_object_array_length(json_obj_datum) == 1) {
+        json_object * json_empty_tx = json_object_new_object();
+        if (!json_empty_tx) {
+            dap_json_rpc_allocation_error;
+            json_object_put(json_obj_datum);
+            return NULL;
+        }
+        json_object_object_add(json_empty_tx, "status", json_object_new_string("empty"));
+        json_object_array_add(json_obj_datum, json_empty_tx);
+    }
+    return json_obj_datum;
+}
+
+json_object* dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t* l_net, const char *l_hash_out_type, json_object * json_obj_summary) {
+        log_it(L_DEBUG, "Start getting tx from chain");
+        size_t l_tx_count = 0;
+        size_t l_tx_ledger_accepted = 0;
+        size_t l_tx_ledger_rejected = 0;
+        dap_chain_cell_t    *l_cell = NULL,
+                            *l_cell_tmp = NULL;
+        dap_chain_atom_iter_t *l_iter = NULL;
+        json_object * json_arr_out = json_object_new_array();
+        HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) {
+            l_iter = l_chain->callback_atom_iter_create(l_chain, l_cell->id, 0);
+            size_t l_atom_size = 0;
+            dap_chain_atom_ptr_t l_ptr = l_chain->callback_atom_iter_get_first(l_iter, &l_atom_size);
+            while (l_ptr && l_atom_size) {
+                size_t l_datums_count = 0;
+                dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count);
+                for (size_t i = 0; i < l_datums_count; i++) {
+                    if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) {
+                        l_tx_count++;
+                        dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datums[i]->data;
+                        dap_hash_fast_t l_ttx_hash = {0};
+                        dap_hash_fast(l_tx, l_datums[i]->header.data_size, &l_ttx_hash);
+                        bool accepted_tx;
+                        json_object* json_obj_datum = dap_db_tx_history_to_json(&l_ttx_hash, NULL, l_tx, l_chain, l_hash_out_type, l_net, 0, &accepted_tx);
+                        if (!json_obj_datum) {
+                            log_it(L_CRITICAL, "Memory allocation error");
+                            return NULL;
+                        }
+                        if (accepted_tx)
+                            l_tx_ledger_accepted++;
+                        else
+                            l_tx_ledger_rejected++;
+                        json_object_array_add(json_arr_out, json_obj_datum);
+                        const char * debug_json_string = json_object_to_json_string(json_obj_datum);
+                    }
+                }
+                DAP_DEL_Z(l_datums);
+                l_ptr = l_chain->callback_atom_iter_get_next(l_iter, &l_atom_size);
+            }
+            l_cell->chain->callback_atom_iter_delete(l_iter);
+        }
+        log_it(L_DEBUG, "END getting tx from chain");
+
+        json_object_object_add(json_obj_summary, "network", json_object_new_string(l_net->pub.name));
+        json_object_object_add(json_obj_summary, "chain", json_object_new_string(l_chain->name));
+        json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(l_tx_count));
+        json_object_object_add(json_obj_summary, "accepted_tx", json_object_new_int(l_tx_ledger_accepted));
+        json_object_object_add(json_obj_summary, "rejected_tx", json_object_new_int(l_tx_ledger_rejected));
+        return json_arr_out;
 }
 
 /**
@@ -688,8 +847,9 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger
  * @param a_str_reply
  * @return int
  */
-int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
+int com_ledger(int a_argc, char ** a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum { CMD_NONE, CMD_LIST, CMD_LEDGER_HISTORY, CMD_TX_INFO };
     int arg_index = 1;
     const char *l_addr_base58 = NULL;
@@ -955,8 +1115,9 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply)
  * @param a_str_reply
  * @return int
  */
-int com_token(int a_argc, char ** a_argv, char **a_str_reply)
+int com_token(int a_argc, char ** a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum { CMD_NONE, CMD_LIST, CMD_INFO, CMD_TX };
     int arg_index = 1;
     const char *l_net_str = NULL;
@@ -1203,8 +1364,9 @@ static dap_chain_datum_anchor_t * s_sign_anchor_in_cycle(dap_cert_t ** a_certs,
 }
 
 // Decree commands handlers
-int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply)
+int cmd_decree(int a_argc, char **a_argv, void ** reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum { CMD_NONE=0, CMD_CREATE, CMD_SIGN, CMD_ANCHOR, CMD_FIND, CMD_INFO };
     enum { TYPE_NONE=0, TYPE_COMMON, TYPE_SERVICE};
     enum { SUBTYPE_NONE=0, SUBTYPE_FEE, SUBTYPE_OWNERS, SUBTYPE_MIN_OWNERS, SUBTYPE_IP_BAN};
diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h
index e4b97ef567babf57cefefdbb2d3cc091e6e5d707..040e4b3b5549dbd6652a930a06f166b391c5b77c 100644
--- a/modules/net/include/dap_chain_node_cli_cmd.h
+++ b/modules/net/include/dap_chain_node_cli_cmd.h
@@ -29,6 +29,12 @@
 #include "dap_chain_net.h"
 #include "dap_chain_node.h"
 #include "dap_chain_node_cli.h"
+#include "json.h"
+
+int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int a_argc,
+                                                           char **a_argv,
+                                                           dap_chain_t **a_chain, dap_chain_net_t **a_net);
+
 
 int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int a_argc, char **a_argv, char ** a_str_reply,
                              dap_chain_t ** a_chain, dap_chain_net_t ** a_net);
@@ -36,12 +42,12 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int a_argc, c
 /**
  * global_db command
  */
-int com_global_db(int a_argc,  char **a_argv, char **a_str_reply);
+int com_global_db(int a_argc,  char **a_argv, void **reply);
 
 /**
  * Node command
  */
-int com_node(int a_argc,  char **a_argv, char **a_str_reply);
+int com_node(int a_argc,  char **a_argv, void **reply);
 
 #ifndef DAP_OS_ANDROID
 /**
@@ -49,50 +55,50 @@ int com_node(int a_argc,  char **a_argv, char **a_str_reply);
  *
  * return 0 OK, -1 Err
  */
-int com_traceroute(int a_argc,  char** argv, char **a_str_reply);
+int com_traceroute(int a_argc,  char** argv, void **reply);
 
 /**
  * Tracepath command
  *
  * return 0 OK, -1 Err
  */
-int com_tracepath(int a_argc,  char** argv, char **a_str_reply);
+int com_tracepath(int a_argc,  char** argv, void **reply);
 
 /**
  * Ping command
  *
  * return 0 OK, -1 Err
  */
-int com_ping(int a_argc,  char** argv, char **a_str_reply);
+int com_ping(int a_argc,  char** argv, void **reply);
 #endif
 /**
  * Help command
  */
-int com_help(int a_argc,  char **a_argv, char **a_str_reply);
+int com_help(int a_argc,  char **a_argv, void **reply);
 
-int com_version(int a_argc, char **a_argv, char **a_str_reply);
+int com_version(int a_argc, char **a_argv, void **reply);
 
 /**
  * Token declaration
  */
-int com_token_decl(int a_argc,  char **a_argv, char ** str_reply);
+int com_token_decl(int a_argc,  char **a_argv, void **reply);
 
-int com_token_update(int a_argc, char **a_argv, char ** a_str_reply);
+int com_token_update(int a_argc, char **a_argv, void ** reply);
 
 /**
  * Token declaration add sign
  */
-int com_token_decl_sign ( int a_argc,  char **a_argv, char ** str_reply);
+int com_token_decl_sign ( int a_argc,  char **a_argv, void **reply);
 
 /*
  * Token update sign
  */
-int com_token_update_sign(int argc, char ** argv, char ** a_str_reply);
+int com_token_update_sign(int argc, char ** argv, void ** reply);
 
 /**
  * Token emission
  */
-int com_token_emit (int a_argc,  char **a_argv, char ** str_reply);
+int com_token_emit (int a_argc,  char **a_argv, void **reply);
 
 
 /**
@@ -100,49 +106,83 @@ int com_token_emit (int a_argc,  char **a_argv, char ** str_reply);
  *
  * Wallet info
  */
-int com_tx_wallet(int a_argc, char **a_argv, char **a_str_reply);
+int com_tx_wallet(int a_argc, char **a_argv, void **reply);
 
 /**
  * com_tx_create command
  *
  * Create transaction
  */
-int com_tx_create(int a_argc, char **a_argv, char **a_str_reply);
-int com_tx_create_json(int a_argc, char **a_argv, char **a_str_reply);
-int com_tx_cond_create(int a_argc, char **a_argv, char **a_str_reply);
+int com_tx_create(int a_argc, char **a_argv, void **reply);
+int com_tx_create_json(int a_argc, char **a_argv, void **reply);
+int com_tx_cond_create(int a_argc, char **a_argv, void **reply);
 
 /**
  * tx_verify command
  *
  * Verifing transaction
  */
-int com_tx_verify(int a_argc, char ** a_argv, char **a_str_reply);
+int com_tx_verify(int a_argc, char ** a_argv, void **reply);
+
+typedef enum s_com_tx_history_err{
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK = 0,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_MEMORY_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR,
+
+    /* add custom codes here */
+
+    DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */
+} s_com_tx_history_err_t;
+
+char *dap_chain_node_cli_com_tx_history_err(int a_code);
 
 /**
  * tx_history command
  *
  * Transaction history for an address
  */
-int com_tx_history(int a_argc, char **a_argv, char **a_str_reply);
+int com_tx_history(int a_argc, char ** a_argv, void ** reply);
+
 
 // Print log info
-int com_print_log(int a_argc, char **a_argv, char **a_str_reply);
+int com_print_log(int a_argc, char **a_argv, void **reply);
 
 // Print statistics
-int com_stats(int a_argc, char **a_argv, char **a_str_reply);
+int com_stats(int a_argc, char **a_argv, void **reply);
 
-int com_exit(int a_argc, char **a_argv, char **a_str_reply);
+int com_exit(int a_argc, char **a_argv, void **reply);
 
-int cmd_gdb_import(int a_argc, char **a_argv, char **a_str_reply);
-int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply);
+int cmd_gdb_import(int a_argc, char **a_argv, void **reply);
+int cmd_gdb_export(int a_argc, char **a_argv, void **reply);
 
-int com_mempool(int a_argc, char **a_argv, char  **a_str_reply);
+typedef enum cmd_mempool_list_err{
+    DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_OK = 0,
+    DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_READ_EMISSION,
+    DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CHAIN_NOT_FOUND,
+    DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_GET_MEMPOOL_GROUP,
+    /* add custom codes here */
+
+    DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_UNKNOWN /* MAX */
+} cmd_mempool_list_err_t;
+int com_mempool(int a_argc, char **a_argv, void **reply);
 /**
  * Place public CA into the mempool
  */
-int com_mempool_add_ca( int a_argc,  char **a_argv, char **a_str_reply);
-int com_chain_ca_pub( int a_argc,  char **a_argv, char **a_str_reply);
-int com_chain_ca_copy( int a_argc,  char **a_argv, char **a_str_reply);
-int com_signer(int a_argc, char **a_argv, char **a_str_reply);
+int com_chain_ca_pub( int a_argc,  char **a_argv, void ** reply);
+int com_chain_ca_copy( int a_argc,  char **a_argv, void ** reply);
+int com_signer(int a_argc, char **a_argv, void ** reply);
 //remove func
-int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply);
+int cmd_remove(int a_argc, char **a_argv, void ** reply);
+
diff --git a/modules/net/include/dap_chain_node_cli_cmd_tx.h b/modules/net/include/dap_chain_node_cli_cmd_tx.h
index 00023c9606ca5636840993efab7af549dd90bc08..3b196a652b3078796d152edcde6bd5d20a247b61 100644
--- a/modules/net/include/dap_chain_node_cli_cmd_tx.h
+++ b/modules/net/include/dap_chain_node_cli_cmd_tx.h
@@ -22,30 +22,50 @@
  along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#pragma once
+
 #include "dap_chain.h"
 #include "dap_chain_common.h"
+#include "json.h"
+
+typedef struct dap_chain_tx_hash_processed_ht{
+    dap_chain_hash_fast_t hash;
+    UT_hash_handle hh;
+}dap_chain_tx_hash_processed_ht_t;
+
+void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed);
 
 /**
  *
- * return history string
+ * return history json
  */
-char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type);
-char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type);
+json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type, dap_chain_net_t * l_net);
+json_object * dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type, const char * l_addr_str);
+json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash,
+                                        dap_hash_fast_t * l_atom_hash,
+                                        dap_chain_datum_tx_t * l_tx,
+                                        dap_chain_t * a_chain, 
+                                        const char *a_hash_out_type, 
+                                        dap_chain_net_t * l_net,
+                                        int l_ret_code,
+                                        bool *accepted_tx);
+json_object* dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t* l_net, const char *l_hash_out_type, json_object * json_obj_summary);
 
 /**
  * ledger command
  *
  */
-int com_ledger(int a_argc, char ** a_argv, char **a_str_reply);
+int com_ledger(int a_argc, char ** a_argv, void **reply);
 
 /**
  * token command
  *
  */
-int com_token(int a_argc, char ** a_argv, char **a_str_reply);
+int com_token(int a_argc, char ** a_argv, void **reply);
 
 /**
  * decree command
  *
  */
-int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply);
+int cmd_decree(int a_argc, char **a_argv, void ** reply);
+
diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c
index ef7885414f357cfa75f7ac529e316503250468db..afdc23e0639a9c6054be2016d2502546f9dc0229 100644
--- a/modules/service/datum/dap_chain_net_srv_datum.c
+++ b/modules/service/datum/dap_chain_net_srv_datum.c
@@ -34,7 +34,7 @@
 #define LOG_TAG "chain_net_srv_datum"
 
 static dap_chain_net_srv_t *s_srv_datum = NULL;
-static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply);
+static int s_srv_datum_cli(int argc, char ** argv, void **reply);
 
 void s_order_notficator(dap_store_obj_t *a_obj, void *a_arg);
 
@@ -102,7 +102,8 @@ char* dap_chain_net_srv_datum_custom_add(dap_chain_t * a_chain, const uint8_t *a
     return l_hash_str;
 }
 
-static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply) {
+static int s_srv_datum_cli(int argc, char ** argv, void **reply) {
+    char ** a_str_reply = (char **) reply;
     int ret = -666;
     int arg_index = 1;
     dap_chain_net_t * l_chain_net = NULL;
diff --git a/modules/service/stake/dap_chain_net_srv_stake_lock.c b/modules/service/stake/dap_chain_net_srv_stake_lock.c
index a925a6bdb78b2d746d622afffa40fd6d306fecc4..292d88b50a2e55c883b845ed3f967ea7c8c3d946 100644
--- a/modules/service/stake/dap_chain_net_srv_stake_lock.c
+++ b/modules/service/stake/dap_chain_net_srv_stake_lock.c
@@ -91,7 +91,7 @@ typedef struct dap_ledger_token_emission_for_stake_lock_item {
 #define MONTH_INDEX	8
 #define YEAR_INDEX	12
 
-static int s_cli_stake_lock(int a_argc, char **a_argv, char **a_str_reply);
+static int s_cli_stake_lock(int a_argc, char **a_argv, void ** reply);
 
 // Create stake lock datum
 static dap_chain_datum_t *s_stake_lock_datum_create(dap_chain_net_t *a_net, dap_enc_key_t *a_key_from,
@@ -690,8 +690,9 @@ static void s_error_handler(enum error_code errorCode, dap_string_t *output_line
  * @param a_str_reply
  * @return
  */
-static int s_cli_stake_lock(int a_argc, char **a_argv, char **a_str_reply)
+static int s_cli_stake_lock(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum{
         CMD_NONE, CMD_HOLD, CMD_TAKE
     };
diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
index 130d6ed21da3eaa9d4626a485a5088df04515d58..7c86ae118feccae149f97ff563845427ecbc726e 100644
--- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
+++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c
@@ -43,7 +43,7 @@
 
 #define DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_GDB_GROUP "delegate_keys"
 
-static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply);
+static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply);
 
 static bool s_stake_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_cond,
                                                       dap_chain_datum_tx_t *a_tx_in, bool a_owner);
@@ -1593,8 +1593,9 @@ uint256_t dap_chain_net_srv_stake_get_total_weight(dap_chain_net_id_t a_net_id)
     return l_total_weight;
 }
 
-static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply)
+static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE, CMD_CHECK
     };
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c
index 0e1f171d23710f4a51cf2843c211314ae8069cd5..19a5edaa4ef2dc77aa92d43a3d6b14aaee701f78 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c
@@ -31,8 +31,9 @@ static void add_value_text(dap_string_t *l_str, char *l_addstr, uintmax_t a_valu
  *
  * VPN statistics
  */
-int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply)
+int com_vpn_statistics(int a_argc, char ** a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     // get statistics for all actual sessions
     dap_list_t *l_sessions_list = dap_stream_session_get_list_sessions(), *l_item;
     dap_string_t *l_str = dap_string_new(NULL);
@@ -91,8 +92,9 @@ int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply)
  *
  * VPN client control
  */
-int com_vpn_client(int a_argc, char ** a_argv, char **a_str_reply)
+int com_vpn_client(int a_argc, char ** a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
 #ifndef _WIN32
     enum {
         CMD_NONE, CMD_INIT, CMD_START, CMD_STOP, CMD_STATUS, CMD_CHECK, CMD_CHECK_RESULT
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h
index e0048f944d583e84e6cdd1e126d47e5112de864e..590dd452185a1d7d726941d4e422d980b47b4a75 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h
+++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h
@@ -1,6 +1,6 @@
 #pragma once
 
 //  VPN statistics
-int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply);
+int com_vpn_statistics(int a_argc, char ** a_argv, void **reply);
 // vpn_client command
-int com_vpn_client(int a_argc, char ** a_argv, char **a_str_reply);
+int com_vpn_client(int a_argc, char ** a_argv, void **reply);
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index 66ff3ee56c63dcc92f4ba6c2fc5056faab90b2a4..1b8092ffa840bbc09dfcaf11cb1c8933437e4ba0 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -72,7 +72,7 @@ static bool s_xchange_verificator_callback(dap_ledger_t * a_ledger, dap_chain_tx
 const dap_chain_net_srv_uid_t c_dap_chain_net_srv_xchange_uid = {.uint64= DAP_CHAIN_NET_SRV_XCHANGE_ID};
 
 
-static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply);
+static int s_cli_srv_xchange(int a_argc, char **a_argv, void **reply);
 static int s_callback_requested(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
 static int s_callback_response_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
 static int s_callback_response_error(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size);
@@ -1738,8 +1738,9 @@ void s_tx_is_order_check(dap_chain_net_t *a_net, dap_chain_datum_tx_t *a_tx, voi
        *l_tx_list_ptr = dap_list_append(*l_tx_list_ptr, a_tx);
 }
 
-static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply)
+static int s_cli_srv_xchange(int a_argc, char **a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {CMD_NONE = 0, CMD_ORDER, CMD_ORDERS, CMD_PURCHASE, CMD_ENABLE, CMD_DISABLE, CMD_TX_LIST, CMD_TOKEN_PAIR };
     int l_arg_index = 1, l_cmd_num = CMD_NONE;
     bool l_rc;
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index c1dfc9207523900b178a79fc9b2005be5c23fe6d..02f96dc2f8a2125cdb20c8cfd73b2dfe909fdce5 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -84,7 +84,7 @@ typedef struct dap_chain_cs_blocks_pvt
 
 static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, char **a_str_reply,const char * a_param, dap_chain_hash_fast_t * a_datum_hash);
 static void s_cli_meta_hash_print(  dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta);
-static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply);
+static int s_cli_blocks(int a_argc, char ** a_argv, void **reply);
 
 // Setup BFT consensus and select the longest chunk
 static void s_bft_consensus_setup(dap_chain_cs_blocks_t * a_blocks);
@@ -504,8 +504,9 @@ static void s_print_autocollect_table(dap_chain_net_t *a_net, dap_string_t *a_re
  * @param a_str_reply
  * @return
  */
-static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply)
+static int s_cli_blocks(int a_argc, char ** a_argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         SUBCMD_UNDEFINED =0,
         SUBCMD_NEW_FLUSH,
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 3a71be2a2d1e53cc11450aead8951a5a540d06f2..6ab3260bcf88b4e4b579407cc7806cd690804cfe 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -131,7 +131,7 @@ static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t *a_datum_i
 static dap_chain_datum_t *s_chain_callback_datum_iter_get_first(dap_chain_datum_iter_t *a_datum_iter); // Get the fisrt datum from dag
 static dap_chain_datum_t *s_chain_callback_datum_iter_get_next(dap_chain_datum_iter_t *a_datum_iter); // Get the next datum from dag
 
-static int s_cli_dag(int argc, char ** argv, char **str_reply);
+static int s_cli_dag(int argc, char ** argv, void **reply);
 void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_item_t * a_event_item);
 
 static size_t s_dap_chain_callback_get_count_tx(dap_chain_t *a_chain);
@@ -1436,8 +1436,9 @@ static dap_chain_datum_t *s_chain_callback_datum_iter_get_next(dap_chain_datum_i
  * @param str_reply
  * @return
  */
-static int s_cli_dag(int argc, char ** argv, char **a_str_reply)
+static int s_cli_dag(int argc, char ** argv, void **reply)
 {
+    char ** a_str_reply = (char **) reply;
     enum {
         SUBCMD_EVENT_CREATE,
         SUBCMD_EVENT_CANCEL,