diff --git a/cellframe-sdk.pro b/cellframe-sdk.pro
index 3e1b5e1eaf9b031230e2263a0825adb993fa12a8..1ea62f57224282ef718f78e2a0dd9a40c8ad46e8 100644
--- a/cellframe-sdk.pro
+++ b/cellframe-sdk.pro
@@ -9,9 +9,8 @@ linux: !android {
 
 win32 {
     
-    CONFIG(release, debug | release): sdk_build.commands = "$$shell_path($$PWD/../cellframe-sdk/prod_build/build.sh)" --target windows release -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
-    CONFIG(debug, debug | release): sdk_build.commands = "$$shell_path($$PWD/../cellframe-sdk/prod_build/build.sh)" --target windows rwd -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
-    
+    CONFIG(release, debug | release): sdk_build.commands = "$$PWD/../cellframe-sdk/prod_build/build.sh" --target windows release -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
+    CONFIG(debug, debug | release): sdk_build.commands = "$$PWD/../cellframe-sdk/prod_build/build.sh" --target windows rwd -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
 }
 
 android {
diff --git a/dap-sdk b/dap-sdk
index d10f992466df726f9981fbc23eefe70b02dd22e4..ac9549ef63a6e90a681cdfa684c0c22e2ac0be3e 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit d10f992466df726f9981fbc23eefe70b02dd22e4
+Subproject commit ac9549ef63a6e90a681cdfa684c0c22e2ac0be3e
diff --git a/modules/datum/include/dap_chain_datum.h b/modules/datum/include/dap_chain_datum.h
index dd4fb4d3ddfee6deeb2803554fbd5f5b6f61d875..693fc5e991fa8b866c6fc6efc61a0d0e8d69a9a4 100644
--- a/modules/datum/include/dap_chain_datum.h
+++ b/modules/datum/include/dap_chain_datum.h
@@ -131,6 +131,10 @@ typedef struct dap_chain_datum{
     byte_t data[]; /// Stored datum body
 } DAP_ALIGN_PACKED dap_chain_datum_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
  * @brief dap_chain_datum_size
  * @param a_datum
@@ -170,3 +174,7 @@ bool dap_chain_datum_dump_tx_json(json_object* a_json_arr_reply,
                              dap_chain_net_id_t a_net_id);
 json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum);
 void dap_chain_datum_dump_json(json_object* a_json_arr_reply,json_object  *a_obj_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id, bool a_verbose);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_anchor.h b/modules/datum/include/dap_chain_datum_anchor.h
index 79a0c48102707bb2f9b4acd0975e0c9411f45ced..6e20b057279f7563d6da53f5960510086396fd66 100644
--- a/modules/datum/include/dap_chain_datum_anchor.h
+++ b/modules/datum/include/dap_chain_datum_anchor.h
@@ -43,6 +43,11 @@ typedef struct dap_chain_datum_anchor{
 // ANCHOR TSD types
 #define DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH                0x0001
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 DAP_STATIC_INLINE size_t dap_chain_datum_anchor_get_size(dap_chain_datum_anchor_t *a_datum_anchor)
 {
     return sizeof(*a_datum_anchor) + a_datum_anchor->header.data_size + a_datum_anchor->header.signs_size;
@@ -53,3 +58,7 @@ void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_sign
                                        size_t a_certs_size, const char *a_hash_out_type);
 
 void dap_chain_datum_anchor_certs_dump_json(json_object * a_json_out, byte_t * a_signs, size_t a_certs_size, const char *a_hash_out_type);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_decree.h b/modules/datum/include/dap_chain_datum_decree.h
index 9cb2ddda2942eb6d772dec69c76b27b14a8531c6..940dab87ad6b6f868015525ea9ee4ddaa6ad1adb 100644
--- a/modules/datum/include/dap_chain_datum_decree.h
+++ b/modules/datum/include/dap_chain_datum_decree.h
@@ -98,6 +98,12 @@ DAP_STATIC_INLINE size_t dap_chain_datum_decree_get_size(dap_chain_datum_decree_
 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_BLOCK_NUM                           0x010C
 #define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_PKEY                          0x010D 
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
 DAP_STATIC_INLINE const char *dap_chain_datum_decree_subtype_to_str(uint16_t a_decree_subtype)
 {
     switch(a_decree_subtype) {
@@ -362,3 +368,8 @@ void dap_chain_datum_decree_certs_dump_json(json_object * a_json_out, byte_t * a
  */
 dap_chain_datum_decree_t* dap_chain_datum_decree_sign_in_cycle(dap_cert_t ** a_certs, dap_chain_datum_decree_t *a_datum_decree,
                                                   size_t a_certs_count, size_t *a_total_sign_count);
+
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_token.h b/modules/datum/include/dap_chain_datum_token.h
index 4553659447d45d60ed751ea29b77e5cf574ca50c..a36b5ee5acece83ca9f1d7d6fef133c230add795 100644
--- a/modules/datum/include/dap_chain_datum_token.h
+++ b/modules/datum/include/dap_chain_datum_token.h
@@ -212,30 +212,6 @@ typedef struct dap_chain_datum_token_tsd_delegate_from_stake_lock {
 
 #define DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED                                0xffff
 
-DAP_STATIC_INLINE const char *dap_chain_datum_token_flag_to_str(uint32_t a_flag)
-{
-    switch (a_flag) {
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_NONE: return "NONE";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED: return "ALL_SENDER_BLOCKED";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED: return "ALL_SENDER_ALLOWED";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN: return "ALL_SENDER_FROZEN";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN: return "ALL_SENDER_UNFROZEN";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED: return "ALL_RECEIVER_BLOCKED";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED: return "ALL_RECEIVER_ALLOWED";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN: return "ALL_RECEIVER_FROZEN";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN: return "ALL_RECEIVER_UNFROZEN";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL: return "STATIC_ALL";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS: return "STATIC_FLAGS";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL: return "STATIC_PERMISSIONS_ALL";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE: return "STATIC_PERMISSIONS_DATUM_TYPE";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER: return "TATIC_PERMISSIONS_TX_SENDER";
-    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER: return "STATIC_PERMISSIONS_TX_RECEIVER";
-    default: return "UNKNOWN FLAG OR FLAGS GROUP";
-    }
-}
-
-uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
-
 /// -------- General tsd types ----
 // Flags set/unsed
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS                            0x0001
@@ -294,36 +270,6 @@ uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
 #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR              0x0025
 
 
-// Get delegated ticker
-DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker)
-{
-    if (!a_buf || !a_ticker)
-        return -1;
-    *a_buf = 'm';
-    dap_strncpy(a_buf + 1, a_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1);
-    return 0;
-}
-
-DAP_STATIC_INLINE bool dap_chain_datum_token_is_old(uint8_t a_type)
-{
-    return a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE
-           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL
-           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE
-           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL
-           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE
-           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
-}
-
-DAP_STATIC_INLINE bool dap_chain_datum_token_check_ticker(const char *a_ticker)
-{
-    const char *c = a_ticker;
-    for (int i = 0; i < DAP_CHAIN_TICKER_SIZE_MAX; i++, c++)
-        if (*c == '\0')
-            return true;
-    return false;
-}
-
-
 /*                              Token emission section                          */
 
 struct DAP_ALIGN_PACKED dap_chain_emission_header_v0 {
@@ -415,6 +361,63 @@ typedef struct dap_chain_datum_token_emission {
 #define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_CROSSCHAIN "CROSSCHAIN"
 #define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_OUT "OUT"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DAP_STATIC_INLINE const char *dap_chain_datum_token_flag_to_str(uint32_t a_flag)
+{
+    switch (a_flag) {
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_NONE: return "NONE";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED: return "ALL_SENDER_BLOCKED";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED: return "ALL_SENDER_ALLOWED";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN: return "ALL_SENDER_FROZEN";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN: return "ALL_SENDER_UNFROZEN";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED: return "ALL_RECEIVER_BLOCKED";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED: return "ALL_RECEIVER_ALLOWED";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN: return "ALL_RECEIVER_FROZEN";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN: return "ALL_RECEIVER_UNFROZEN";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL: return "STATIC_ALL";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS: return "STATIC_FLAGS";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL: return "STATIC_PERMISSIONS_ALL";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE: return "STATIC_PERMISSIONS_DATUM_TYPE";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER: return "TATIC_PERMISSIONS_TX_SENDER";
+    case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER: return "STATIC_PERMISSIONS_TX_RECEIVER";
+    default: return "UNKNOWN FLAG OR FLAGS GROUP";
+    }
+}
+
+uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
+
+// Get delegated ticker
+DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker)
+{
+    if (!a_buf || !a_ticker)
+        return -1;
+    *a_buf = 'm';
+    dap_strncpy(a_buf + 1, a_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1);
+    return 0;
+}
+
+DAP_STATIC_INLINE bool dap_chain_datum_token_is_old(uint8_t a_type)
+{
+    return a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE
+           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL
+           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE
+           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL
+           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE
+           || a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
+}
+
+DAP_STATIC_INLINE bool dap_chain_datum_token_check_ticker(const char *a_ticker)
+{
+    const char *c = a_ticker;
+    for (int i = 0; i < DAP_CHAIN_TICKER_SIZE_MAX; i++, c++)
+        if (*c == '\0')
+            return true;
+    return false;
+}
+
 DAP_STATIC_INLINE const char *dap_chain_datum_emission_type_str(uint8_t a_type)
 {
     switch (a_type) {
@@ -445,3 +448,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_
 dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t *a_emission, size_t *a_signs_count);
 // 256 TYPE
 bool dap_chain_datum_token_is_old(uint8_t a_type);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_tx.h b/modules/datum/include/dap_chain_datum_tx.h
index f0b617b4fcef004ad58701d239f91d6ba9b0c193..460d27641b08b1ac9c302a0c8baedb219915cebf 100644
--- a/modules/datum/include/dap_chain_datum_tx.h
+++ b/modules/datum/include/dap_chain_datum_tx.h
@@ -92,6 +92,10 @@ typedef struct dap_chain_datum_tx_item_groups {
 
 } dap_chain_datum_tx_item_groups_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 bool dap_chain_datum_tx_group_items(dap_chain_datum_tx_t *a_tx,  dap_chain_datum_tx_item_groups_t *a_res_group);
 void dap_chain_datum_tx_group_items_free( dap_chain_datum_tx_item_groups_t *a_group);
 
@@ -243,3 +247,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a
     dap_chain_datum_tx_item_get_nth(a_tx, TX_ITEM_TYPE_OUT_ALL, a_out_num);
 
 dap_chain_tx_tsd_t *dap_chain_datum_tx_item_get_tsd_by_type(dap_chain_datum_tx_t *a_tx, int a_type);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_tx_items.h b/modules/datum/include/dap_chain_datum_tx_items.h
index d5866d5c00eb23dff77d737d38cdaa6f2fa854fc..34d7a5afdcd2a99e489e85c25d08f64cec1b85b4 100644
--- a/modules/datum/include/dap_chain_datum_tx_items.h
+++ b/modules/datum/include/dap_chain_datum_tx_items.h
@@ -44,6 +44,11 @@
 
 typedef struct dap_chain_datum_tx dap_chain_datum_tx_t;
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
  * Get item name by item type
  *
@@ -210,3 +215,8 @@ dap_sign_t *dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
 byte_t *dap_chain_datum_tx_item_get_data(dap_chain_tx_tsd_t *a_tx_tsd, int *a_type, size_t *a_size);
 
 dap_chain_tx_tsd_t *dap_chain_datum_tx_item_get_tsd_by_type(dap_chain_datum_tx_t *a_tx, int a_type);
+
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_tx_out_cond.h b/modules/datum/include/dap_chain_datum_tx_out_cond.h
index e743afd559f710946ff73fe4ad8f0b1eecf057c0..a15e582664de1c43161e2cc1b4fa75b3101b4b22 100644
--- a/modules/datum/include/dap_chain_datum_tx_out_cond.h
+++ b/modules/datum/include/dap_chain_datum_tx_out_cond.h
@@ -42,19 +42,6 @@ enum dap_chain_tx_out_cond_subtype {
 };
 typedef byte_t dap_chain_tx_out_cond_subtype_t;
 
-DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_out_cond_subtype_t a_subtype){
-    switch (a_subtype) {
-    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY";
-    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE";
-    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE";
-    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE";
-    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK";
-    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_EMIT_DELEGATE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_EMIT_DELEGATE";
-    default: {}
-    }
-    return "UNDEFINED";
-}
-
 // Stake lock base flags
 // Lock by time
 #define DAP_CHAIN_NET_SRV_STAKE_LOCK_FLAG_BY_TIME           0x00000008
@@ -134,3 +121,25 @@ typedef struct dap_chain_tx_out_cond {
     uint32_t tsd_size; // Condition parameters size
     uint8_t tsd[]; // condition parameters, pkey, hash or smth like this
 } DAP_ALIGN_PACKED dap_chain_tx_out_cond_t;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_out_cond_subtype_t a_subtype){
+    switch (a_subtype) {
+    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY";
+    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE";
+    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE";
+    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE";
+    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK";
+    case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_EMIT_DELEGATE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_EMIT_DELEGATE";
+    default: {}
+    }
+    return "UNDEFINED";
+}
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/datum/include/dap_chain_datum_tx_voting.h b/modules/datum/include/dap_chain_datum_tx_voting.h
index c66eca792365b5ca3ec9d356589e313f54eead51..e2376921e2ac87055fb54bb0af4b7df1146353fa 100644
--- a/modules/datum/include/dap_chain_datum_tx_voting.h
+++ b/modules/datum/include/dap_chain_datum_tx_voting.h
@@ -66,6 +66,10 @@ typedef struct dap_chain_datum_tx_voting_params {
     bool       vote_changing_allowed;
 } dap_chain_datum_tx_voting_params_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 dap_chain_datum_tx_voting_params_t *dap_chain_datum_tx_voting_parse_tsd(dap_chain_datum_tx_t* a_tx);
 void dap_chain_datum_tx_voting_params_delete(dap_chain_datum_tx_voting_params_t *a_params);
 
@@ -84,3 +88,7 @@ json_object *dap_chain_datum_tx_item_voting_tsd_to_json(dap_chain_datum_tx_t* a_
 dap_chain_tx_vote_t *dap_chain_datum_tx_item_vote_create(dap_chain_hash_fast_t *a_voting_hash, uint64_t *a_answer_idx);
 json_object *dap_chain_datum_tx_item_vote_to_json(dap_chain_tx_vote_t *a_vote);
 char *dap_chain_datum_tx_voting_get_answer_text_by_idx(dap_chain_datum_tx_t *a_tx, uint64_t a_idx);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/ledger/include/dap_chain_ledger.h b/modules/ledger/include/dap_chain_ledger.h
index 0814bb03189efb30e8821db20ec5e4091deb5bf1..4ebf36ffd58529b49fa66e9d1a9b37af3f762392 100644
--- a/modules/ledger/include/dap_chain_ledger.h
+++ b/modules/ledger/include/dap_chain_ledger.h
@@ -134,67 +134,6 @@ typedef enum dap_ledger_check_error {
     DAP_LEDGER_TX_CHECK_MULTIPLE_OUTS_TO_OTHER_NET
 } dap_ledger_check_error_t;
 
-DAP_STATIC_INLINE const char *dap_ledger_check_error_str(dap_ledger_check_error_t a_error)
-{
-    switch (a_error) {
-    case DAP_LEDGER_CHECK_OK: return "No error";
-    case DAP_LEDGER_CHECK_INVALID_ARGS: return "Invalid arguments";
-    case DAP_LEDGER_CHECK_INVALID_SIZE: return "Incorrect size of datum or datum's content";
-    case DAP_LEDGER_CHECK_ALREADY_CACHED: return "Datum already cached in ledger";
-    case DAP_LEDGER_CHECK_PARSE_ERROR: return "Incorrect datum interrnal structure, can't pasre it";
-    case DAP_LEDGER_CHECK_APPLY_ERROR: return "Datum can't be applied";
-    case DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY: return "Not enough memory";
-    case DAP_LEDGER_CHECK_INTEGER_OVERFLOW: return "Incorrect datum values relationship lead to integer overflow, can't process";
-    case DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS: return "No enough valid signatures in datum";
-    case DAP_LEDGER_CHECK_TICKER_NOT_FOUND: return "Can't find specified token ticker";
-    case DAP_LEDGER_CHECK_INVALID_TICKER: return "Specified token ticker is invalid";
-    case DAP_LEDGER_CHECK_ZERO_VALUE: return "Unacceptable zero value";
-    case DAP_LEDGER_CHECK_ADDR_FORBIDDEN: return "Specified address is forbidden";
-    case DAP_LEDGER_CHECK_WHITELISTED: return "Datum is in hard accept list";
-    /* TX check return codes */
-    case DAP_LEDGER_TX_CHECK_IN_EMS_ALREADY_USED: return "Double spend attempt for emission";
-    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_IN_EMS_ALREADY_USED: return "Double spend attempt for stake-lock emission";
-    case DAP_LEDGER_TX_CHECK_EMISSION_NOT_FOUND: return "Specified emission not found in ledger";
-    case DAP_LEDGER_TX_CHECK_TX_NO_VALID_INPUTS: return "Transaction has no valid inputs, can't process";
-    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_INVALID_TOKEN: return "Incorrect deledated token specified in stake-lock transaction";
-    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_NO_OUT_COND_FOR_IN_EMS: return "Condtional output for stake-lock emission not found";
-    case DAP_LEDGER_TX_CHECK_NO_OUT_EXT_FOR_GIRDLED_IN_EMS: return "Tokenized output for stake-lock girdled emission not found";
-    case DAP_LEDGER_TX_CHECK_NO_OUT_ITEMS_FOR_BASE_TX: return "Output for basic transaction not found";
-    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_UNEXPECTED_VALUE: return "Incorrect value for stake-lock emission, should be stake * rate";
-    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_OTHER_TICKER_EXPECTED: return "Incorrect token ticker for stake-lock emission";
-    case DAP_LEDGER_TX_CHECK_OUT_ITEM_ALREADY_USED: return "Double spend attempt for transaction output";
-    case DAP_LEDGER_TX_CHECK_PREV_TX_NOT_FOUND: return "No previous transaction found";
-    case DAP_LEDGER_TX_CHECK_PREV_OUT_ITEM_NOT_FOUND: return "Specified output number not found in previous transaction";
-    case DAP_LEDGER_TX_CHECK_PREV_OUT_ITEM_MISSTYPED: return "Previuos transaction output has unknown type, possible ledger corruption";
-    case DAP_LEDGER_TX_CHECK_PKEY_HASHES_DONT_MATCH: return "Trying to spend transaction output from wrongful wallet";
-    case DAP_LEDGER_TX_CHECK_PREV_OUT_ALREADY_USED_IN_CURRENT_TX: return "Double spend attempt within single transaction";
-    case DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET: return "No verificator found for specified conditional ipnput";
-    case DAP_LEDGER_TX_CHECK_VERIFICATOR_CHECK_FAILURE: return "Verificator check return error";
-    case DAP_LEDGER_TX_CHECK_SUM_INS_NOT_EQUAL_SUM_OUTS: return "Sum of transaction outputs isn't equal to sum of its inputs";
-    case DAP_LEDGER_TX_CHECK_REWARD_ITEM_ALREADY_USED: return "Double spend attempt for reward";
-    case DAP_LEDGER_TX_CHECK_REWARD_ITEM_ILLEGAL: return "Wrongful reward item in transaction";
-    case DAP_LEDGER_TX_CHECK_NO_MAIN_TICKER: return "Can't calculate main ticker found for transaction";
-    case DAP_LEDGER_TX_CHECK_UNEXPECTED_TOKENIZED_OUT: return "Tokenized out is forbidden for single-channel trandactions";
-    case DAP_LEDGER_TX_CHECK_NOT_ENOUGH_FEE: return "Not enough network fee for transaction processing";
-    case DAP_LEDGER_TX_CHECK_NOT_ENOUGH_TAX: return "Not enough sovereign tax provided with current transaction";
-    case DAP_LEDGER_TX_CHECK_FOR_REMOVING_CANT_FIND_TX: return "Can't find tx in ledger for removing.";
-    case DAP_LEDGER_TX_CHECK_MULTIPLE_OUTS_TO_OTHER_NET: return "The transaction was rejected because it contains multiple outputs to other networks.";
-    /* Emisssion check return codes */
-    case DAP_LEDGER_EMISSION_CHECK_VALUE_EXCEEDS_CURRENT_SUPPLY: return "Value of emission execeeds current token supply";
-    case DAP_LEDGER_EMISSION_CHECK_LEGACY_FORBIDDEN: return "Legacy type of emissions are present for old chains comliance only";
-    /* Token declaration/update return codes */
-    case DAP_LEDGER_TOKEN_ADD_CHECK_NOT_ENOUGH_UNIQUE_SIGNS: return "Not all token signs is unique";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_LEGACY_FORBIDDEN: return "Legacy type of tokens are present for old chains comliance only";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_SUPPLY: return "Specified supply must be greater than current one";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_ADDR: return "Specified address has invalid format";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_ADDR_MISMATCH: return "Specified address can't be processed cause double (for adding) or absent (for removing)";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_PKEY_MISMATCH: return "Specified public key or its hash can't be processed cause double (for adding) or absent (for removing)";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_FORBIDDEN: return "Specified TSD section type is not allowed in datum token of specified type";
-    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_OTHER_TICKER_EXPECTED: return "Incorrect token ticker for delegated token";
-    default: return "Unknown error";
-    }
-}
-
 typedef enum dap_ledger_notify_opcodes {
     DAP_LEDGER_NOTIFY_OPCODE_ADDED = 'a', // 0x61
     DAP_LEDGER_NOTIFY_OPCODE_DELETED = 'd', // 0x64 
@@ -236,21 +175,6 @@ typedef struct dap_ledger_datum_iter_data {
     dap_chain_srv_uid_t uid;
 } dap_ledger_datum_iter_data_t;
 
-typedef int   (*dap_ledger_cond_in_verify_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_in,  dap_hash_fast_t *a_tx_in_hash,  dap_chain_tx_out_cond_t *a_prev_cond, bool a_owner);
-typedef int  (*dap_ledger_cond_out_verify_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_out, dap_hash_fast_t *a_tx_out_hash, dap_chain_tx_out_cond_t *a_cond);
-typedef void     (*dap_ledger_cond_in_add_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_in,  dap_hash_fast_t *a_tx_in_hash,  dap_chain_tx_out_cond_t *a_prev_cond);
-typedef void    (*dap_ledger_cond_out_add_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_out, dap_hash_fast_t *a_tx_out_hash, dap_chain_tx_out_cond_t *a_cond);
-typedef void  (*dap_ledger_cond_in_delete_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_in,  dap_hash_fast_t *a_tx_in_hash,  dap_chain_tx_out_cond_t *a_prev_cond);
-typedef void (*dap_ledger_cond_out_delete_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_out, dap_hash_fast_t *a_tx_out_hash, dap_chain_tx_out_cond_t *a_cond);
-typedef void (* dap_ledger_tx_add_notify_t)(void *a_arg, dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ledger_notify_opcodes_t a_opcode);
-typedef void (* dap_ledger_bridged_tx_notify_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, void *a_arg, dap_ledger_notify_opcodes_t a_opcode);
-typedef bool (*dap_ledger_cache_tx_check_callback_t)(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_hash);
-typedef int (*dap_ledger_voting_callback_t)(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_type, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_apply);
-typedef bool (*dap_ledger_voting_delete_callback_t)(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_type, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash);
-typedef dap_time_t (*dap_ledger_voting_expire_callback_t)(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash);
-typedef bool (*dap_ledger_tag_check_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_datum_tx_item_groups_t *a_items_grp, dap_chain_tx_tag_action_type_t *a_action);
-typedef bool (*dap_ledger_tax_callback_t)(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_signer_pkey_hash, dap_chain_addr_t *a_tax_addr, uint256_t *a_tax_value);
-
 //Change this UUID to automatically reload ledger cache on next node startup
 #define DAP_LEDGER_CACHE_RELOAD_ONCE_UUID "0c92b759-a565-448f-b8bd-99103dacf7fc"
 
@@ -285,9 +209,90 @@ typedef bool (*dap_ledger_tax_callback_t)(dap_chain_net_id_t a_net_id, dap_hash_
 #define DAP_LEDGER_SPENT_TXS_STR           "spent_txs"
 #define DAP_LEDGER_BALANCES_STR            "balances"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_ledger_init();
 void dap_ledger_deinit();
 
+DAP_STATIC_INLINE const char *dap_ledger_check_error_str(dap_ledger_check_error_t a_error)
+{
+    switch (a_error) {
+    case DAP_LEDGER_CHECK_OK: return "No error";
+    case DAP_LEDGER_CHECK_INVALID_ARGS: return "Invalid arguments";
+    case DAP_LEDGER_CHECK_INVALID_SIZE: return "Incorrect size of datum or datum's content";
+    case DAP_LEDGER_CHECK_ALREADY_CACHED: return "Datum already cached in ledger";
+    case DAP_LEDGER_CHECK_PARSE_ERROR: return "Incorrect datum interrnal structure, can't pasre it";
+    case DAP_LEDGER_CHECK_APPLY_ERROR: return "Datum can't be applied";
+    case DAP_LEDGER_CHECK_NOT_ENOUGH_MEMORY: return "Not enough memory";
+    case DAP_LEDGER_CHECK_INTEGER_OVERFLOW: return "Incorrect datum values relationship lead to integer overflow, can't process";
+    case DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS: return "No enough valid signatures in datum";
+    case DAP_LEDGER_CHECK_TICKER_NOT_FOUND: return "Can't find specified token ticker";
+    case DAP_LEDGER_CHECK_INVALID_TICKER: return "Specified token ticker is invalid";
+    case DAP_LEDGER_CHECK_ZERO_VALUE: return "Unacceptable zero value";
+    case DAP_LEDGER_CHECK_ADDR_FORBIDDEN: return "Specified address is forbidden";
+    case DAP_LEDGER_CHECK_WHITELISTED: return "Datum is in hard accept list";
+    /* TX check return codes */
+    case DAP_LEDGER_TX_CHECK_IN_EMS_ALREADY_USED: return "Double spend attempt for emission";
+    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_IN_EMS_ALREADY_USED: return "Double spend attempt for stake-lock emission";
+    case DAP_LEDGER_TX_CHECK_EMISSION_NOT_FOUND: return "Specified emission not found in ledger";
+    case DAP_LEDGER_TX_CHECK_TX_NO_VALID_INPUTS: return "Transaction has no valid inputs, can't process";
+    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_INVALID_TOKEN: return "Incorrect deledated token specified in stake-lock transaction";
+    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_NO_OUT_COND_FOR_IN_EMS: return "Condtional output for stake-lock emission not found";
+    case DAP_LEDGER_TX_CHECK_NO_OUT_EXT_FOR_GIRDLED_IN_EMS: return "Tokenized output for stake-lock girdled emission not found";
+    case DAP_LEDGER_TX_CHECK_NO_OUT_ITEMS_FOR_BASE_TX: return "Output for basic transaction not found";
+    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_UNEXPECTED_VALUE: return "Incorrect value for stake-lock emission, should be stake * rate";
+    case DAP_LEDGER_TX_CHECK_STAKE_LOCK_OTHER_TICKER_EXPECTED: return "Incorrect token ticker for stake-lock emission";
+    case DAP_LEDGER_TX_CHECK_OUT_ITEM_ALREADY_USED: return "Double spend attempt for transaction output";
+    case DAP_LEDGER_TX_CHECK_PREV_TX_NOT_FOUND: return "No previous transaction found";
+    case DAP_LEDGER_TX_CHECK_PREV_OUT_ITEM_NOT_FOUND: return "Specified output number not found in previous transaction";
+    case DAP_LEDGER_TX_CHECK_PREV_OUT_ITEM_MISSTYPED: return "Previuos transaction output has unknown type, possible ledger corruption";
+    case DAP_LEDGER_TX_CHECK_PKEY_HASHES_DONT_MATCH: return "Trying to spend transaction output from wrongful wallet";
+    case DAP_LEDGER_TX_CHECK_PREV_OUT_ALREADY_USED_IN_CURRENT_TX: return "Double spend attempt within single transaction";
+    case DAP_LEDGER_TX_CHECK_NO_VERIFICATOR_SET: return "No verificator found for specified conditional ipnput";
+    case DAP_LEDGER_TX_CHECK_VERIFICATOR_CHECK_FAILURE: return "Verificator check return error";
+    case DAP_LEDGER_TX_CHECK_SUM_INS_NOT_EQUAL_SUM_OUTS: return "Sum of transaction outputs isn't equal to sum of its inputs";
+    case DAP_LEDGER_TX_CHECK_REWARD_ITEM_ALREADY_USED: return "Double spend attempt for reward";
+    case DAP_LEDGER_TX_CHECK_REWARD_ITEM_ILLEGAL: return "Wrongful reward item in transaction";
+    case DAP_LEDGER_TX_CHECK_NO_MAIN_TICKER: return "Can't calculate main ticker found for transaction";
+    case DAP_LEDGER_TX_CHECK_UNEXPECTED_TOKENIZED_OUT: return "Tokenized out is forbidden for single-channel trandactions";
+    case DAP_LEDGER_TX_CHECK_NOT_ENOUGH_FEE: return "Not enough network fee for transaction processing";
+    case DAP_LEDGER_TX_CHECK_NOT_ENOUGH_TAX: return "Not enough sovereign tax provided with current transaction";
+    case DAP_LEDGER_TX_CHECK_FOR_REMOVING_CANT_FIND_TX: return "Can't find tx in ledger for removing.";
+    case DAP_LEDGER_TX_CHECK_MULTIPLE_OUTS_TO_OTHER_NET: return "The transaction was rejected because it contains multiple outputs to other networks.";
+    /* Emisssion check return codes */
+    case DAP_LEDGER_EMISSION_CHECK_VALUE_EXCEEDS_CURRENT_SUPPLY: return "Value of emission execeeds current token supply";
+    case DAP_LEDGER_EMISSION_CHECK_LEGACY_FORBIDDEN: return "Legacy type of emissions are present for old chains comliance only";
+    /* Token declaration/update return codes */
+    case DAP_LEDGER_TOKEN_ADD_CHECK_NOT_ENOUGH_UNIQUE_SIGNS: return "Not all token signs is unique";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_LEGACY_FORBIDDEN: return "Legacy type of tokens are present for old chains comliance only";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_SUPPLY: return "Specified supply must be greater than current one";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_INVALID_ADDR: return "Specified address has invalid format";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_ADDR_MISMATCH: return "Specified address can't be processed cause double (for adding) or absent (for removing)";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_PKEY_MISMATCH: return "Specified public key or its hash can't be processed cause double (for adding) or absent (for removing)";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_FORBIDDEN: return "Specified TSD section type is not allowed in datum token of specified type";
+    case DAP_LEDGER_TOKEN_ADD_CHECK_TSD_OTHER_TICKER_EXPECTED: return "Incorrect token ticker for delegated token";
+    default: return "Unknown error";
+    }
+}
+
+typedef int   (*dap_ledger_cond_in_verify_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_in,  dap_hash_fast_t *a_tx_in_hash,  dap_chain_tx_out_cond_t *a_prev_cond, bool a_owner);
+typedef int  (*dap_ledger_cond_out_verify_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_out, dap_hash_fast_t *a_tx_out_hash, dap_chain_tx_out_cond_t *a_cond);
+typedef void     (*dap_ledger_cond_in_add_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_in,  dap_hash_fast_t *a_tx_in_hash,  dap_chain_tx_out_cond_t *a_prev_cond);
+typedef void    (*dap_ledger_cond_out_add_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_out, dap_hash_fast_t *a_tx_out_hash, dap_chain_tx_out_cond_t *a_cond);
+typedef void  (*dap_ledger_cond_in_delete_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_in,  dap_hash_fast_t *a_tx_in_hash,  dap_chain_tx_out_cond_t *a_prev_cond);
+typedef void (*dap_ledger_cond_out_delete_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx_out, dap_hash_fast_t *a_tx_out_hash, dap_chain_tx_out_cond_t *a_cond);
+typedef void (* dap_ledger_tx_add_notify_t)(void *a_arg, dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ledger_notify_opcodes_t a_opcode);
+typedef void (* dap_ledger_bridged_tx_notify_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, void *a_arg, dap_ledger_notify_opcodes_t a_opcode);
+typedef bool (*dap_ledger_cache_tx_check_callback_t)(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_hash);
+typedef int (*dap_ledger_voting_callback_t)(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_type, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_apply);
+typedef bool (*dap_ledger_voting_delete_callback_t)(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_type, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash);
+typedef dap_time_t (*dap_ledger_voting_expire_callback_t)(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash);
+typedef bool (*dap_ledger_tag_check_callback_t)(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_datum_tx_item_groups_t *a_items_grp, dap_chain_tx_tag_action_type_t *a_action);
+typedef bool (*dap_ledger_tax_callback_t)(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_signer_pkey_hash, dap_chain_addr_t *a_tax_addr, uint256_t *a_tax_value);
+
+
 dap_ledger_t *dap_ledger_create(dap_chain_net_t *a_net, uint16_t a_flags);
 
 // Clear & remove dap_ledger_t structure
@@ -509,3 +514,7 @@ dap_ledger_hardfork_anchors_t *dap_ledger_anchors_aggregate(dap_ledger_t *a_ledg
 uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_prev_hash, int a_out_idx);
 void dap_ledger_tx_clear_colour(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_hash);
 dap_pkey_t *dap_ledger_find_pkey_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_pkey_hash);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index 020fbf15e067e96dcf352d8cc43082b1736c4239..2b0c0524848de65ebaee8f4b9db52a0c0644a050 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -884,11 +884,12 @@ char* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t *a_net, dap_chain_h
     uint256_t l_new_val = {};
     uint256_t l_value_cond = l_out_cond->header.value;
     SUBTRACT_256_256(l_out_cond->header.value, l_value_send, &l_new_val);
-    //if (!!IS_ZERO_256(l_new_val)){
-        l_out_cond->header.value = l_new_val; // Use old conditinal output to form the new one
-        dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_out_cond);
-        l_out_cond->header.value = l_value_cond;    // Restore original value
-    //}
+    if (!IS_ZERO_256(l_new_val)){
+        dap_chain_tx_out_cond_t *l_new_out_cond = DAP_DUP_SIZE(l_out_cond, sizeof(dap_chain_tx_out_cond_t) + l_out_cond->tsd_size);
+        l_new_out_cond->header.value = l_new_val;
+        dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_new_out_cond);
+        DAP_DELETE(l_new_out_cond);
+    }
     // add 'sign' item
     if(dap_chain_datum_tx_add_sign_item(&l_tx, a_key_tx_sign) != 1) {
         dap_chain_datum_tx_delete(l_tx);
diff --git a/modules/net-srv/include/dap_chain_net_srv.h b/modules/net-srv/include/dap_chain_net_srv.h
index 20a15570af43a696ae6ca30d6e943a06660dcc84..96419afec90657805df3a9157c285e2df89c8dba 100755
--- a/modules/net-srv/include/dap_chain_net_srv.h
+++ b/modules/net-srv/include/dap_chain_net_srv.h
@@ -94,14 +94,6 @@ typedef struct dap_chain_net_srv_client_remote {
     struct dap_chain_net_srv_client_remote *next;
 } dap_chain_net_srv_client_remote_t;
 
-// Common service callback
-typedef int  (*dap_chain_net_srv_callback_data_t)(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_custom_data, size_t a_custom_data_size);
-// Custom service callback
-typedef void * (*dap_chain_net_srv_callback_custom_data_t)(dap_chain_net_srv_t *a_srv, dap_chain_net_srv_usage_t *a_usage, const void *a_custom_data, size_t a_sustom_data_size, size_t *a_out_data_size);\
-// Store limits sevice callbacks
-typedef dap_chain_net_srv_ch_remain_service_store_t * (*dap_chain_net_srv_callback_get_remain_service_t)(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client);
-typedef int (*dap_chain_net_srv_callback_save_remain_service_t)(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client);
-
 typedef struct dap_chain_net_srv_banlist_item {
     dap_chain_hash_fast_t client_pkey_hash;
     pthread_mutex_t *ht_mutex;
@@ -109,6 +101,14 @@ typedef struct dap_chain_net_srv_banlist_item {
     UT_hash_handle hh;
 } dap_chain_net_srv_banlist_item_t;
 
+
+// Common service callback
+typedef int  (*dap_chain_net_srv_callback_data_t)(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_custom_data, size_t a_custom_data_size);
+// Custom service callback
+typedef void * (*dap_chain_net_srv_callback_custom_data_t)(dap_chain_net_srv_t *a_srv, dap_chain_net_srv_usage_t *a_usage, const void *a_custom_data, size_t a_sustom_data_size, size_t *a_out_data_size);\
+// Store limits sevice callbacks
+typedef dap_chain_net_srv_ch_remain_service_store_t * (*dap_chain_net_srv_callback_get_remain_service_t)(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client);
+typedef int (*dap_chain_net_srv_callback_save_remain_service_t)(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client);
 typedef struct dap_chain_net_srv_callbacks {
     // Request for usage
     dap_chain_net_srv_callback_data_t requested;
@@ -154,6 +154,11 @@ typedef struct dap_chain_net_srv {
     void *_inheritor;
 } dap_chain_net_srv_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
 int dap_chain_net_srv_init();
 void dap_chain_net_srv_deinit(void);
 
@@ -200,3 +205,7 @@ DAP_STATIC_INLINE bool dap_chain_net_srv_uid_compare_scalar(const dap_chain_srv_
 {
     return a_uid1.uint64 == a_id;
 }
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net-srv/include/dap_chain_net_srv_ch.h b/modules/net-srv/include/dap_chain_net_srv_ch.h
index 1cf05ebd445f9eaf2b253f4071b6af326178d627..f422c4e1aa3ee8c38724738e6e0bd0b945309e8b 100644
--- a/modules/net-srv/include/dap_chain_net_srv_ch.h
+++ b/modules/net-srv/include/dap_chain_net_srv_ch.h
@@ -45,7 +45,16 @@ typedef struct dap_chain_net_srv_ch {
 #define DAP_CHAIN_NET_SRV_CH(a) ((dap_chain_net_srv_ch_t *) ((a)->internal) )
 #define DAP_CHAIN_NET_SRV_CH_ID 'R'
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_chain_net_srv_ch_init();
 
 int dap_chain_net_srv_ch_grace_control(dap_chain_net_srv_t *a_net_srv, dap_hash_fast_t *a_tx_hash);
 char *dap_chain_net_srv_ch_create_statistic_report();
+
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net-srv/include/dap_chain_net_srv_ch_pkt.h b/modules/net-srv/include/dap_chain_net_srv_ch_pkt.h
index c56925508994fab6cd65f041d49225883d93f617..9ae7cab0a04627fbf29a3b8376032cb2e1642526 100644
--- a/modules/net-srv/include/dap_chain_net_srv_ch_pkt.h
+++ b/modules/net-srv/include/dap_chain_net_srv_ch_pkt.h
@@ -144,6 +144,9 @@ typedef struct dap_chain_net_srv_ch_pkt_test {
     uint8_t                 data[];
 } DAP_ALIGN_PACKED dap_chain_net_srv_ch_pkt_test_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 size_t dap_chain_net_srv_ch_pkt_data_write(dap_stream_ch_t *a_ch,
                                                   dap_chain_srv_uid_t a_srv_uid, uint32_t a_usage_id  ,
                                                   const void * a_data, size_t a_data_size);
@@ -153,3 +156,6 @@ DAP_PRINTF_ATTR(4, 5) size_t dap_chain_net_srv_ch_pkt_data_write_f(dap_stream_ch
                                                                           uint32_t a_usage_id,
                                                                           const char *a_str,
                                                                           ...);
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net-srv/include/dap_chain_net_srv_client.h b/modules/net-srv/include/dap_chain_net_srv_client.h
index 8fafbdf1e23c12a6155628b412e311d80887f24e..22256e21263108419c250779d934490af3d782e6 100644
--- a/modules/net-srv/include/dap_chain_net_srv_client.h
+++ b/modules/net-srv/include/dap_chain_net_srv_client.h
@@ -61,6 +61,10 @@ typedef struct dap_chain_net_srv_client {
     void *_inheritor;
 } dap_chain_net_srv_client_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_net_t *a_net, char *a_addr, uint16_t a_port,
                                                                       dap_chain_net_srv_client_callbacks_t *a_callbacks,
                                                                       void *a_callbacks_arg);
@@ -68,3 +72,6 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_
 void dap_chain_net_srv_client_close(dap_chain_net_srv_client_t *a_client);
 
 ssize_t dap_chain_net_srv_client_write(dap_chain_net_srv_client_t *a_client, uint8_t a_type, void *a_pkt_data, size_t a_pkt_data_size);
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net-srv/include/dap_chain_net_srv_order.h b/modules/net-srv/include/dap_chain_net_srv_order.h
index 5c5995896853c7131ce4c2ae33ff7c62c503fe69..0a30d212e3ea01eff2b3a4c2bef14fd0e99b3eb3 100644
--- a/modules/net-srv/include/dap_chain_net_srv_order.h
+++ b/modules/net-srv/include/dap_chain_net_srv_order.h
@@ -48,6 +48,10 @@ typedef struct dap_chain_net_srv_order {
     uint8_t ext_n_sign[];
 } DAP_ALIGN_PACKED dap_chain_net_srv_order_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 // Init/deinit should be call only if private
 int dap_chain_net_srv_order_init();
 void dap_chain_net_srv_order_deinit(void);
@@ -157,3 +161,7 @@ DAP_STATIC_INLINE char *dap_chain_net_srv_order_get_common_group(dap_chain_net_t
 {
     return a_net ? dap_strdup_printf("%s.orders", a_net->pub.gdb_groups_prefix) : NULL;
 }
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net-srv/include/dap_chain_net_srv_stream_session.h b/modules/net-srv/include/dap_chain_net_srv_stream_session.h
index 6f3f460647056cdc9d35c36b9f9167b7487b84b8..8ab3842e644a1f4785fad46fe243f7f86db74836 100644
--- a/modules/net-srv/include/dap_chain_net_srv_stream_session.h
+++ b/modules/net-srv/include/dap_chain_net_srv_stream_session.h
@@ -98,6 +98,11 @@ typedef struct dap_chain_net_srv_stream_session {
 
 #define DAP_CHAIN_NET_SRV_STREAM_SESSION(a) ((dap_chain_net_srv_stream_session_t *) (a)->_inheritor )
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 dap_chain_net_srv_stream_session_t * dap_chain_net_srv_stream_session_create( dap_stream_session_t * a_session);
 void dap_chain_net_srv_stream_session_delete( dap_stream_session_t * a_session);
 dap_chain_net_srv_usage_t* dap_chain_net_srv_usage_add (dap_chain_net_srv_stream_session_t * a_srv_session,
@@ -105,3 +110,7 @@ dap_chain_net_srv_usage_t* dap_chain_net_srv_usage_add (dap_chain_net_srv_stream
 void dap_chain_net_srv_usage_delete (dap_chain_net_srv_stream_session_t * a_srv_session);
 dap_chain_net_srv_usage_t* dap_chain_net_srv_usage_find_unsafe (dap_chain_net_srv_stream_session_t * a_srv_session,
                                                                              uint32_t a_usage_id);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/dap_chain_net_tx.c b/modules/net/dap_chain_net_tx.c
index b153d5b86af6b78bf5e82bb1807e3ee41255d58d..26157f5c55a5212ad442b8e4924764da84031646 100644
--- a/modules/net/dap_chain_net_tx.c
+++ b/modules/net/dap_chain_net_tx.c
@@ -1204,68 +1204,46 @@ int dap_chain_net_tx_create_by_json(json_object *a_tx_json, dap_chain_net_t *a_n
             }
         }
             break;
-        case TX_ITEM_TYPE_SIG:{          
-            const char *l_sign_type_str = s_json_get_text(l_json_item_obj, "sig_type");          
-            if (l_sign_type_str) {
-                dap_sign_type_t l_sign_type = dap_sign_type_from_str(l_sign_type_str);
-                if (l_sign_type.type == SIG_TYPE_NULL) {
-                    json_object *l_jobj_err = json_object_new_string("Can't define sign type");
-                    json_object_array_add(l_jobj_errors, l_jobj_err);
-                    log_it(L_ERROR, "Json TX: Can't define sign type \"%s\"", l_sign_type_str);
-                    break;
-                }
-                int64_t l_pkey_size, l_sig_size, l_hash_type = 0;
-
-                s_json_get_int64(l_json_item_obj, "hash_type", &l_hash_type);
-                s_json_get_int64(l_json_item_obj, "pub_key_size", &l_pkey_size);
-                s_json_get_int64(l_json_item_obj, "sig_size", &l_sig_size);
-                debug_if(!l_pkey_size || !l_sig_size, L_WARNING,
-                         "\"pub_key_size\" or \"sig_size\" not provided! Will be calculated automatically");
-                
-                json_object *l_jobj_pub_key = json_object_object_get(l_json_item_obj, "pub_key_b64"),
-                            *l_jobj_sign = json_object_object_get(l_json_item_obj, "sig_b64");
-                if (!l_jobj_pub_key || !l_jobj_sign) {
-                    json_object *l_jobj_err = json_object_new_string("Can't get base64-encoded sign or pkey!");
-                    json_object_array_add(l_jobj_errors, l_jobj_err);
-                    log_it(L_ERROR, "Json TX: Can't get base64-encoded sign or pkey!");
-                    break;
+        case TX_ITEM_TYPE_SIG: {
+            json_object *l_jobj_sign = json_object_object_get(l_json_item_obj, "sig_b64");
+            if (!l_jobj_sign) {
+                l_sign_list = dap_list_append(l_sign_list, l_json_item_obj);
+                break;
+            }
+            const char *l_sign_b64_str = json_object_get_string(l_json_item_obj);
+            if ( !l_sign_b64_str ) {
+                json_object_array_add(l_jobj_errors, json_object_new_string("Can't get base64-encoded sign"));
+                log_it(L_ERROR, "Json TX: Can't get base64-encoded sign!");
+                break;
+            }
+            int64_t l_sign_size = 0, l_sign_b64_strlen = json_object_get_string_len(l_json_item_obj),
+                    l_sign_decoded_size = DAP_ENC_BASE64_DECODE_SIZE(l_sign_b64_strlen);
+            if ( !s_json_get_int64(l_json_item_obj, "sig_size", &l_sign_size) )
+                log_it(L_NOTICE, "Json TX: \"sig_size\" unspecified, will be calculated automatically");
+
+            dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE(dap_chain_tx_sig_t, sizeof(dap_chain_tx_sig_t) + l_sign_decoded_size);
+            *l_tx_sig = (dap_chain_tx_sig_t) {
+                .header = {
+                    .type = TX_ITEM_TYPE_SIG, .version = 1,
+                    .sig_size = dap_enc_base64_decode(l_sign_b64_str, l_sign_b64_strlen, l_tx_sig->sig, DAP_ENC_DATA_TYPE_B64_URLSAFE)
                 }
-                const char *l_pub_key_str = json_object_get_string(l_jobj_pub_key),
-                           *l_sign_str = json_object_get_string(l_jobj_sign);
-                int64_t l_pkey_decoded_size = DAP_ENC_BASE64_DECODE_SIZE(strlen(l_pub_key_str)),
-                        l_sign_decoded_size = DAP_ENC_BASE64_DECODE_SIZE(strlen(l_sign_str));
-                
-                dap_sign_t *l_sign = DAP_NEW_SIZE(dap_sign_t, sizeof(dap_sign_t) + l_pkey_decoded_size + l_sign_decoded_size);
-                *l_sign = (dap_sign_t) {
-                    .header.type = l_sign_type,
-                    .header.hash_type = (uint8_t)l_hash_type,
-                };
-                l_pkey_decoded_size = dap_enc_base64_decode(l_pub_key_str, strlen(l_pub_key_str),
-                                                            l_sign->pkey_n_sign, DAP_ENC_DATA_TYPE_B64_URLSAFE);
-                debug_if(l_pkey_size != l_pkey_decoded_size, L_ERROR, "Json TX: pkey size mismatch, %zu != %zu",
-                                                                      l_pkey_size, l_pkey_decoded_size);
-
-                l_sign_decoded_size = dap_enc_base64_decode(l_sign_str, strlen(l_sign_str),
-                                                            l_sign->pkey_n_sign + l_pkey_decoded_size, DAP_ENC_DATA_TYPE_B64_URLSAFE);
-                debug_if(l_sig_size != l_sign_decoded_size, L_ERROR, "Json TX: sign size mismatch, %zu != %zu",
-                                                                     l_sig_size, l_sign_decoded_size);
-
-                l_sign->header.sign_size = l_sign_decoded_size;
-                l_sign->header.sign_pkey_size = l_pkey_decoded_size;
-                size_t l_sign_full_size = dap_sign_get_size(l_sign);
-                
-                dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE(dap_chain_tx_sig_t, sizeof(dap_chain_tx_sig_t) + l_sign_full_size);
-                l_tx_sig->header.type = TX_ITEM_TYPE_SIG;
-                l_tx_sig->header.version = 1;
-                l_tx_sig->header.sig_size = (uint32_t)l_sign_full_size;
-                memcpy(l_tx_sig->sig, l_sign, l_sign_full_size);
-                l_item = (const uint8_t*)l_tx_sig;
-                DAP_DELETE(l_sign);
+            };
+            
+            debug_if(l_sign_size && l_tx_sig->header.sig_size != l_sign_size, L_ERROR,
+                     "Json TX: sign size mismatch, %zu != %u!", l_sign_size, l_tx_sig->header.sig_size);
+            /* But who cares?... */
+            size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx), l_tx_items_size = l_tx->header.tx_items_size;
+            l_tx->header.tx_items_size = 0;
+            if ( dap_sign_verify_all((dap_sign_t*)l_tx_sig->sig, l_tx_sig->header.sig_size, (byte_t*)l_tx, l_tx_size) ) {
+                json_object_array_add(l_jobj_errors, json_object_new_string("Sign verification failed!"));
+                log_it(L_ERROR, "Json TX: sign verification failed!");
                 break;
-            } else              
-                l_sign_list = dap_list_append(l_sign_list,l_json_item_obj);
-        }
-            break;
+                // TODO: delete the datum and return
+            } else {
+                l_tx->header.tx_items_size = l_tx_items_size;
+                l_item = (const uint8_t*)l_tx_sig;
+            }
+        } break;
         case TX_ITEM_TYPE_RECEIPT: {
             dap_chain_srv_uid_t l_srv_uid;
             uint64_t l_srv_id_ui64 = 0;
@@ -1584,23 +1562,13 @@ int dap_chain_net_tx_to_json(dap_chain_datum_tx_t *a_tx, json_object *a_out_json
         } break;
         case TX_ITEM_TYPE_SIG: {
             dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t*)item);
-            json_object_object_add(json_obj_item,"type", json_object_new_string("sign"));
-            dap_chain_hash_fast_t l_hash_pkey;
-            json_object_object_add(json_obj_item,"sig_type",json_object_new_string(dap_sign_type_to_str(l_sign->header.type)));
-            json_object_object_add(json_obj_item,"pub_key_size",json_object_new_uint64(l_sign->header.sign_pkey_size));
-            json_object_object_add(json_obj_item,"sig_size",json_object_new_uint64(l_sign->header.sign_size));
-            json_object_object_add(json_obj_item,"hash_type",json_object_new_uint64(l_sign->header.hash_type));
-            
-            char l_pkey_base64[DAP_ENC_BASE64_ENCODE_SIZE(l_sign->header.sign_pkey_size) + 1];
-            size_t l_pkey_base64_size = dap_enc_base64_encode(l_sign->pkey_n_sign, l_sign->header.sign_pkey_size, l_pkey_base64, DAP_ENC_DATA_TYPE_B64_URLSAFE); 
-            l_pkey_base64[l_pkey_base64_size] = '\0';   
-            json_object_object_add(json_obj_item,"pub_key_b64", json_object_new_string(l_pkey_base64));     
-
-            char l_sign_base64[DAP_ENC_BASE64_ENCODE_SIZE(l_sign->header.sign_size) + 1];
-            size_t l_sign_base64_size = dap_enc_base64_encode(l_sign->pkey_n_sign + l_sign->header.sign_pkey_size, l_sign->header.sign_size, l_sign_base64, DAP_ENC_DATA_TYPE_B64_URLSAFE); 
-            l_sign_base64[l_sign_base64_size] = '\0';
-            json_object_object_add(json_obj_item,"sig_b64", json_object_new_string(l_sign_base64));
+            char *l_sign_b64 = DAP_NEW_Z_SIZE(char, DAP_ENC_BASE64_ENCODE_SIZE(dap_sign_get_size(l_sign)) + 1);
+            size_t l_sign_size = dap_sign_get_size(l_sign);
+            dap_enc_base64_encode(l_sign, l_sign_size, l_sign_b64, DAP_ENC_DATA_TYPE_B64_URLSAFE);
 
+            json_object_object_add(json_obj_item, "type",       json_object_new_string("sign"));
+            json_object_object_add(json_obj_item, "sig_size",   json_object_new_uint64(l_sign_size));
+            json_object_object_add(json_obj_item, "sig_b64",    json_object_new_string(l_sign_b64));
         } break;
         case TX_ITEM_TYPE_TSD: {
             json_object_object_add(json_obj_item,"type", json_object_new_string("data"));
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 9cd99062a7e2ef74a0f84cbd215686b57781ed08..1a0b3594fc7f1e6e65981e76d7e5786c13e5db7c 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -76,6 +76,38 @@ typedef struct dap_chain_net {
     uint8_t pvt[];
 } dap_chain_net_t;
 
+enum dap_chain_net_json_rpc_error_list{
+    DAP_CHAIN_NET_JSON_RPC_OK,
+    DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_HASH = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_PARAMETER_NET_REQUIRE,
+    DAP_CHAIN_NET_JSON_RPC_WRONG_NET,
+    DAP_CHAIN_NET_JSON_RPC_MANY_ARGUMENT_FOR_COMMAND_NET_LIST,
+    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS,
+    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_GO,
+    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_ADDR_COMMAND_INFO,
+    DAP_CHAIN_NET_JSON_RPC_CANT_CALCULATE_HASH_FOR_ADDR,
+    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_GET_CLUSTER,
+    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_LINK,
+    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_SYNC,
+    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_CA_ADD,
+    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_ADD,
+    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_KEY_IN_CERT_CA_ADD,
+    DAP_CHAIN_NET_JSON_RPC_CAN_SERIALIZE_PUBLIC_KEY_CERT_CA_ADD,
+    DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_ADD,
+    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE,
+    DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_LIST,
+    DAP_CHAIN_NET_JSON_RPC_UNKNOWN_HASH_CA_DEL,
+    DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_DEL,
+    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_DEL,
+    DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_COMMAND_CA,
+    DAP_CHAIN_NET_JSON_RPC_NO_POA_CERTS_FOUND_POA_CERTS,
+    DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 DAP_STATIC_INLINE int dap_chain_net_id_parse(const char *a_id_str, dap_chain_net_id_t *a_id)
 {
     uint64_t l_id;
@@ -185,30 +217,7 @@ struct json_object *dap_chain_net_states_json_collect(dap_chain_net_t * l_net);
 struct json_object *dap_chain_net_list_json_collect();
 struct json_object *dap_chain_nets_info_json_collect();
 
-enum dap_chain_net_json_rpc_error_list{
-    DAP_CHAIN_NET_JSON_RPC_OK,
-    DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_HASH = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
-    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_PARAMETER_NET_REQUIRE,
-    DAP_CHAIN_NET_JSON_RPC_WRONG_NET,
-    DAP_CHAIN_NET_JSON_RPC_MANY_ARGUMENT_FOR_COMMAND_NET_LIST,
-    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS,
-    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_GO,
-    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_ADDR_COMMAND_INFO,
-    DAP_CHAIN_NET_JSON_RPC_CANT_CALCULATE_HASH_FOR_ADDR,
-    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_GET_CLUSTER,
-    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_LINK,
-    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_COMMAND_SYNC,
-    DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETERS_CA_ADD,
-    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_ADD,
-    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_KEY_IN_CERT_CA_ADD,
-    DAP_CHAIN_NET_JSON_RPC_CAN_SERIALIZE_PUBLIC_KEY_CERT_CA_ADD,
-    DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_ADD,
-    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_SAVE_PUBLIC_KEY_IN_DATABASE,
-    DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_LIST,
-    DAP_CHAIN_NET_JSON_RPC_UNKNOWN_HASH_CA_DEL,
-    DAP_CHAIN_NET_JSON_RPC_DATABASE_ACL_GROUP_NOT_DEFINED_FOR_THIS_NETWORK_CA_DEL,
-    DAP_CHAIN_NET_JSON_RPC_CAN_NOT_FIND_CERT_CA_DEL,
-    DAP_CHAIN_NET_JSON_RPC_INVALID_PARAMETER_COMMAND_CA,
-    DAP_CHAIN_NET_JSON_RPC_NO_POA_CERTS_FOUND_POA_CERTS,
-    DAP_CHAIN_NET_JSON_RPC_UNKNOWN_SUBCOMMANDS
-};
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/modules/net/include/dap_chain_net_balancer.h b/modules/net/include/dap_chain_net_balancer.h
index cfef8633e966a985f37ad6c4ec512b00094f7521..a691a177ab910fe79291ab916bc327ca4a2b2846 100644
--- a/modules/net/include/dap_chain_net_balancer.h
+++ b/modules/net/include/dap_chain_net_balancer.h
@@ -47,6 +47,11 @@ typedef struct dap_balancer_link_request {
     dap_balancer_type_t type;
 } dap_balancer_link_request_t;
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 DAP_STATIC_INLINE const char *dap_chain_net_balancer_type_to_str(dap_balancer_type_t a_type)
 {
     switch (a_type) {
@@ -62,3 +67,7 @@ dap_link_info_t *dap_chain_net_balancer_dns_issue_link(const char *a_net_name);
 int dap_chain_net_balancer_handshake(dap_chain_node_info_t *a_node_info, dap_chain_net_t * a_net);
 dap_string_t *dap_chain_net_balancer_get_node_str(dap_chain_net_t *a_net);
 void dap_chain_net_balancer_request(void *a_arg);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/include/dap_chain_net_ch.h b/modules/net/include/dap_chain_net_ch.h
index 3a94ea70d81ffe5b25323929d78008bd3d4bb3ca..5f58e41ce14eb2592922984f7002778fd7fc0931 100644
--- a/modules/net/include/dap_chain_net_ch.h
+++ b/modules/net/include/dap_chain_net_ch.h
@@ -64,7 +64,16 @@ typedef struct dap_chain_ch_validator_test{
 #define DAP_CHAIN_NET_CH_ID 'N'
 #define DAP_STREAM_CH_CHAIN_NET(a) ((dap_chain_net_ch_t *) ((a)->internal) )
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 dap_chain_node_addr_t dap_chain_net_ch_from_session_data_extract_node_addr(uint32_t a_session_id);
 
 int dap_chain_net_ch_init();
 void dap_chain_net_ch_deinit();
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/include/dap_chain_net_ch_pkt.h b/modules/net/include/dap_chain_net_ch_pkt.h
index 2ec1d8900c672f6751da3bf7374d8184d2175fa9..8680802e992633449f56fd93a1f758e9c1f03a54 100644
--- a/modules/net/include/dap_chain_net_ch_pkt.h
+++ b/modules/net/include/dap_chain_net_ch_pkt.h
@@ -59,6 +59,13 @@ typedef struct dap_chain_net_ch_pkt{
     uint8_t data[];
 } DAP_ALIGN_PACKED dap_chain_net_ch_pkt_t;
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 size_t dap_chain_net_ch_pkt_write(dap_stream_ch_t *a_ch, uint8_t a_type, dap_chain_net_id_t a_net_id, const void * a_data, size_t a_data_size);
 DAP_PRINTF_ATTR(4, 5) size_t dap_chain_net_ch_pkt_write_f(dap_stream_ch_t *a_ch, uint8_t a_type, dap_chain_net_id_t a_net_id, const char *a_str, ...);
 
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/include/dap_chain_net_node_list.h b/modules/net/include/dap_chain_net_node_list.h
index 8fe6dd6b1b62ef57f0f31f2885210b454b1fa54c..0ce6badf63ac3bac9c76ab39b4690a4dd1b69bbe 100644
--- a/modules/net/include/dap_chain_net_node_list.h
+++ b/modules/net/include/dap_chain_net_node_list.h
@@ -42,6 +42,12 @@ struct node_link_request {
     int response;
 };
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
 /**
 * @brief dap_chain_net_node_list_get_gdb_group
 * @param a_net
@@ -55,3 +61,7 @@ DAP_STATIC_INLINE char* dap_chain_net_node_list_get_gdb_group(dap_chain_net_t *
 void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg);
 int dap_chain_net_node_list_request(dap_chain_net_t *a_net, uint16_t a_port, bool a_sync, char a_cmd);
 int dap_chain_net_node_list_init();
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/include/dap_chain_net_tx.h b/modules/net/include/dap_chain_net_tx.h
index a0ab8d8e52a0c0a9b9960613eeedc44adbab7c65..ee2d91560cb7108d7fbd65a5facbb0927d3e7bb7 100644
--- a/modules/net/include/dap_chain_net_tx.h
+++ b/modules/net/include/dap_chain_net_tx.h
@@ -81,6 +81,9 @@ typedef struct dap_chain_datum_tx_spends_items{
 } dap_chain_datum_tx_spends_items_t;
 typedef void (dap_chain_net_tx_hash_callback_t)(dap_chain_net_t* a_net, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, void *a_arg);
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 // TX functions
 dap_chain_datum_tx_t * dap_chain_net_get_tx_by_hash(dap_chain_net_t * a_net, dap_chain_hash_fast_t * a_tx_hash,
@@ -134,3 +137,7 @@ int dap_chain_net_tx_create_by_json(json_object *a_tx_json, dap_chain_net_t *a_n
  * @return s_com_tx_create_json_err_t status code
  */
 int dap_chain_net_tx_to_json(dap_chain_datum_tx_t *a_tx, json_object *a_out_json);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 2b25fbc6c27a74fdb7473e82d2d6eadb2f701709..2aad02832df30b382416dabae6ca40d5e7ee1b86 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -85,6 +85,11 @@ typedef enum dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json {
     DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_PARAMS_MUST_BE_UNSIGNED
 } dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
 /**
  * Calculate size of struct dap_chain_node_info_t
  */
@@ -117,3 +122,7 @@ int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(json_object* a_json_a
                                                            char **a_argv,
                                                            dap_chain_t **a_chain, dap_chain_net_t **a_net,
                                                            dap_chain_type_t a_default_chain_type);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h
index 291dda9af2f38eb0b7ac6fe3b6f9e51f3bf041e7..6d43fd02774a9a84c67b1072853c4f026aa64453 100644
--- a/modules/net/include/dap_chain_node_client.h
+++ b/modules/net/include/dap_chain_node_client.h
@@ -106,6 +106,11 @@ typedef struct dap_chain_node_client {
 
 #define DAP_CHAIN_NODE_CLIENT(a) (a ? (dap_chain_node_client_t *) (a)->_inheritor : NULL)
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_chain_node_client_init();
 
 void dap_chain_node_client_deinit(void);
@@ -171,3 +176,7 @@ static inline const char * dap_chain_node_client_state_to_str( dap_chain_node_cl
     }
 
 }
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c
index 8d41e5883fc3d963c4ff9081bb5c60f5276494da..0e97e22308d7b8b50023988ce69beccc2746b098 100644
--- a/modules/node-cli/dap_chain_node_cli_cmd.c
+++ b/modules/node-cli/dap_chain_node_cli_cmd.c
@@ -86,6 +86,9 @@
 #include "dap_notify_srv.h"
 #include "dap_chain_wallet_cache.h"
 
+
+#include "dap_chain_net_tx.h"
+
 #define LOG_TAG "chain_node_cli_cmd"
 
 int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void **a_str_reply);
@@ -1722,6 +1725,12 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
             break;
         }
         case CMD_WALLET_OUTPUTS: {
+            if(!l_net) {
+                dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR,
+                                        "Subcommand info requires parameter '-net'");
+                json_object_put(json_arr_out);
+                return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR;
+            }
             if ((l_wallet_name && l_addr_str) || (!l_wallet_name && !l_addr_str)) {
                 dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR,
                 "You should use either the -w or -addr option for the wallet info command.");
@@ -1729,12 +1738,6 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE;
                 return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NAME_ERR;
             }
             if(l_wallet_name) {
-                if(!l_net) {
-                    dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR,
-                                           "Subcommand info requires parameter '-net'");
-                    json_object_put(json_arr_out);
-                    return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR;
-                }
                 l_wallet = dap_chain_wallet_open(l_wallet_name, c_wallets_path, NULL);
                 if (!l_wallet){
                     dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_COM_TX_WALLET_NET_PARAM_ERR,
diff --git a/modules/node-cli/include/dap_chain_node_cli.h b/modules/node-cli/include/dap_chain_node_cli.h
index 14b52dc90be74173df11b54054ac930e0b2156b1..c3a9e62c7f081813166b2e8c087d1833c4f1eec3 100644
--- a/modules/node-cli/include/dap_chain_node_cli.h
+++ b/modules/node-cli/include/dap_chain_node_cli.h
@@ -32,6 +32,11 @@
 
 #include "dap_cli_server.h"
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /**
  * Initialization of the server side of the interaction
  * with the console kelvin-node-cli
@@ -42,3 +47,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config);
  * Deinitialization of the server side
  */
 void dap_chain_node_cli_delete(void);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/node-cli/include/dap_chain_node_cli_cmd.h b/modules/node-cli/include/dap_chain_node_cli_cmd.h
index ecbac225873d2890dfa3301d0e0a1461472df2aa..f3b9edff8112d25b0e1bdab203746313a6812427 100644
--- a/modules/node-cli/include/dap_chain_node_cli_cmd.h
+++ b/modules/node-cli/include/dap_chain_node_cli_cmd.h
@@ -31,9 +31,6 @@
 #include "dap_chain_node_cli.h"
 #include "json.h"
 
-int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int a_argc, char **a_argv, void **a_str_reply,
-                             dap_chain_t ** a_chain, dap_chain_net_t ** a_net, dap_chain_type_t a_default_chain_type);
-
 typedef enum s_com_parse_net_chain_err{
     DAP_CHAIN_NODE_CLI_COM_PARSE_NET_NET_STR_ERR = 100,
     DAP_CHAIN_NODE_CLI_COM_PARSE_NET_NET_PARAM_ERR,
@@ -45,11 +42,6 @@ typedef enum s_com_parse_net_chain_err{
     DAP_CHAIN_NODE_CLI_COM_PARSE_NET_UNKNOWN /* MAX */
 } s_com_parse_net_chain_err_t;
 
-
-/**
- * global_db command
- */
-int com_global_db(int a_argc,  char **a_argv, void **a_str_reply);
 typedef enum s_com_global_db_json_err {
     DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_OK = 0,
 
@@ -82,62 +74,6 @@ typedef enum s_com_global_db_json_err {
     DAP_CHAIN_NODE_CLI_COM_GLOBAL_DB_JSON_CAN_NOT_ADD_TRANSACTION_TO_MEMPOOL
 }s_com_global_db_json_err_t;
 
-/**
- * Node command
- */
-int com_node(int a_argc,  char **a_argv, void **a_str_reply);
-
-#ifndef DAP_OS_ANDROID
-/**
- * Traceroute command
- *
- * return 0 OK, -1 Err
- */
-int com_traceroute(int a_argc,  char** argv, void **a_str_reply);
-
-/**
- * Tracepath command
- *
- * return 0 OK, -1 Err
- */
-int com_tracepath(int a_argc,  char** argv, void **a_str_reply);
-
-/**
- * Ping command
- *
- * return 0 OK, -1 Err
- */
-int com_ping(int a_argc,  char** argv, void **a_str_reply);
-#endif
-/**
- * Help command
- */
-int com_help(int a_argc,  char **a_argv, void **a_str_reply);
-
-int com_version(int a_argc, char **a_argv, void **a_str_reply);
-
-/**
- * Token declaration
- */
-int com_token_decl(int a_argc,  char **a_argv, void **a_str_reply);
-
-int com_token_update(int a_argc, char **a_argv, void **a_str_reply);
-
-/**
- * Token declaration add sign
- */
-int com_token_decl_sign ( int a_argc,  char **a_argv, void **a_str_reply);
-
-/*
- * Token update sign
- */
-int com_token_update_sign(int argc, char ** argv, void **a_str_reply);
-
-/**
- * Token emission
- */
-int com_token_emit (int a_argc,  char **a_argv, void **a_str_reply);
-
 typedef enum s_com_tx_wallet_err{
     DAP_CHAIN_NODE_CLI_COM_TX_WALLET_MEMORY_ERR,
     DAP_CHAIN_NODE_CLI_COM_TX_WALLET_PARAM_ERR,
@@ -166,13 +102,6 @@ typedef enum s_com_tx_wallet_err{
     DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */
 } s_com_tx_wallet_err_t;
 
-/**
- * com_tx_create command
- *
- * Wallet info
- */
-int com_tx_wallet(int a_argc, char **a_argv, void **a_str_reply);
-
 /**
  * com_tx_create command
  *
@@ -204,9 +133,6 @@ typedef enum s_com_tx_create_err{
     DAP_CHAIN_NODE_CLI_COM_TX_CREATE_CAN_NOT_CREATE_TRANSACTION,
     DAP_CHAIN_NODE_CLI_COM_TX_CREATE_EQ_SOURCE_DESTINATION_ADDRESS
 }s_com_tx_create_err_t;
-int com_tx_create(int a_argc, char **a_argv, void **a_str_reply);
-void json_rpc_tx_create(json_object *a_param, json_object *a_reply);
-int com_tx_create_json(int a_argc, char **a_argv, void **reply);
 typedef enum s_com_tx_cond_create{
     DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_OK = 0,
     DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_INVALID_PARAMETER_HEX = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
@@ -228,7 +154,6 @@ typedef enum s_com_tx_cond_create{
     DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CERT_DOES_NOT_CONATIN_VALID_PUBLIC_KEY,
     DAP_CHAIN_NODE_CLI_COM_TX_COND_CREATE_CAN_NOT_CONDITIONAL_TX_CREATE
 }s_com_tx_cond_create_t;
-int com_tx_cond_create(int a_argc, char **a_argv, void **reply);
 typedef enum s_com_tx_cond_remove{
     DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_OK = 0,
     DAP_CHAIN_NODE_CLI_COM_TX_COND_REMOVE_INVALID_PARAMETER_HEX = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
@@ -341,8 +266,6 @@ typedef enum s_com_print_log_err{
     DAP_CHAIN_NODE_CLI_COM_PRINT_LOG_REQUIRES_PARAMETER_LIMIT,
     DAP_CHAIN_NODE_CLI_COM_PRINT_LOG_NO_LOGS
 }s_com_print_log_err_t;
-
-int com_tx_cond_remove(int a_argc, char **a_argv, void **reply);
 typedef enum s_com_tx_cond_unspent_find{
     DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_OK = 0,
     DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_INVALID_PARAMETER_HEX = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
@@ -355,8 +278,6 @@ typedef enum s_com_tx_cond_unspent_find{
     DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_NATIVE_TICKER_IN_NET,
     DAP_CHAIN_NODE_CLI_COM_TX_COND_UNSPEND_FIND_CAN_NOT_FIND_LEDGER_FOR_NET,
 }s_com_tx_cond_unspent_find_t;
-int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply);
-
 typedef enum s_com_tx_verify{
     DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_OK = 0,
     DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_REQUIRE_PARAMETER_TX = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
@@ -366,14 +287,6 @@ typedef enum s_com_tx_verify{
     DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_HASH_IS_NOT_TX_HASH,
     DAP_CHAIN_NODE_CLI_COM_TX_VERIFY_TX_NOT_VERIFY
 }s_com_tx_verify_t;
-/**
- * tx_verify command
- *
- * Verifing transaction
- */
-
-int com_tx_verify(int a_argc, char ** a_argv, void **a_str_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,
@@ -395,6 +308,131 @@ typedef enum s_com_tx_history_err{
 
     //DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */
 } s_com_tx_history_err_t;
+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;
+typedef enum cmd_find_list_err {
+    DAP_CHAIN_NODE_CLI_FIND_OK = 0,
+    DAP_CHAIN_NODE_CLI_FIND_ERR_PARSE_HASH = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
+    DAP_CHAIN_NODE_CLI_FUND_ERR_UNKNOWN_SUBCMD,
+    DAP_CHAIN_NODE_CLI_FIND_ERR_HASH_IS_NOT_SPECIFIED,
+    DAP_CHAIN_NODE_CLI_FIND_ERR_UNKNOWN_SUBTYPE_DECREE,
+    DAP_CHIAN_NODE_CLI_FIND_ERR_SUBTYPE_DECREE_IS_NOT_SPECIFIED,
+    DAP_CHAIN_NODE_CLI_FIND_ERR_UNKNOWN_PARAMETR_WHERE,
+}cmd_find_list_err_t;
+
+typedef enum s_com_file_err{
+    DAP_CHAIN_NODE_CLI_COM_FILE_OK = 0,
+    DAP_CHAIN_NODE_CLI_COM_FILE_MEMORY_ERR,
+    DAP_CHAIN_NODE_CLI_COM_FILE_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_FILE_SOURCE_FILE_ERR,
+    DAP_CHAIN_NODE_CLI_COM_FILE_DEST_FILE_ERR,
+    DAP_CHAIN_NODE_CLI_COM_FILE_NUM_ERR
+
+
+} s_com_file_err_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index, int a_argc, char **a_argv, void **a_str_reply,
+                             dap_chain_t ** a_chain, dap_chain_net_t ** a_net, dap_chain_type_t a_default_chain_type);
+
+
+/**
+ * global_db command
+ */
+int com_global_db(int a_argc,  char **a_argv, void **a_str_reply);
+
+/**
+ * Node command
+ */
+int com_node(int a_argc,  char **a_argv, void **a_str_reply);
+
+#ifndef DAP_OS_ANDROID
+/**
+ * Traceroute command
+ *
+ * return 0 OK, -1 Err
+ */
+int com_traceroute(int a_argc,  char** argv, void **a_str_reply);
+
+/**
+ * Tracepath command
+ *
+ * return 0 OK, -1 Err
+ */
+int com_tracepath(int a_argc,  char** argv, void **a_str_reply);
+
+/**
+ * Ping command
+ *
+ * return 0 OK, -1 Err
+ */
+int com_ping(int a_argc,  char** argv, void **a_str_reply);
+#endif
+/**
+ * Help command
+ */
+int com_help(int a_argc,  char **a_argv, void **a_str_reply);
+
+int com_version(int a_argc, char **a_argv, void **a_str_reply);
+
+/**
+ * Token declaration
+ */
+int com_token_decl(int a_argc,  char **a_argv, void **a_str_reply);
+
+int com_token_update(int a_argc, char **a_argv, void **a_str_reply);
+
+/**
+ * Token declaration add sign
+ */
+int com_token_decl_sign ( int a_argc,  char **a_argv, void **a_str_reply);
+
+/*
+ * Token update sign
+ */
+int com_token_update_sign(int argc, char ** argv, void **a_str_reply);
+
+/**
+ * Token emission
+ */
+int com_token_emit (int a_argc,  char **a_argv, void **a_str_reply);
+
+/**
+ * com_tx_create command
+ *
+ * Wallet info
+ */
+int com_tx_wallet(int a_argc, char **a_argv, void **a_str_reply);
+
+
+int com_tx_create(int a_argc, char **a_argv, void **a_str_reply);
+void json_rpc_tx_create(json_object *a_param, json_object *a_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);
+
+int com_tx_cond_remove(int a_argc, char **a_argv, void **reply);
+
+int com_tx_cond_unspent_find(int a_argc, char **a_argv, void **reply);
+
+
+/**
+ * tx_verify command
+ *
+ * Verifing transaction
+ */
+
+int com_tx_verify(int a_argc, char ** a_argv, void **a_str_reply);
 
 char *dap_chain_node_cli_com_tx_history_err(int a_code);
 
@@ -412,16 +450,6 @@ int com_exit(int a_argc, char **a_argv, void **a_str_reply);
 
 int cmd_gdb_import(int a_argc, char **a_argv, void **a_str_reply);
 int cmd_gdb_export(int a_argc, char **a_argv, void **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 **a_str_reply);
 /**
  * Place public CA into the mempool
@@ -432,15 +460,6 @@ int com_signer(int a_argc, char **a_argv, void **a_str_reply);
 //remove func
 int cmd_remove(int a_argc, char **a_argv, void **a_str_reply);
 
-typedef enum cmd_find_list_err {
-    DAP_CHAIN_NODE_CLI_FIND_OK = 0,
-    DAP_CHAIN_NODE_CLI_FIND_ERR_PARSE_HASH = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START,
-    DAP_CHAIN_NODE_CLI_FUND_ERR_UNKNOWN_SUBCMD,
-    DAP_CHAIN_NODE_CLI_FIND_ERR_HASH_IS_NOT_SPECIFIED,
-    DAP_CHAIN_NODE_CLI_FIND_ERR_UNKNOWN_SUBTYPE_DECREE,
-    DAP_CHIAN_NODE_CLI_FIND_ERR_SUBTYPE_DECREE_IS_NOT_SPECIFIED,
-    DAP_CHAIN_NODE_CLI_FIND_ERR_UNKNOWN_PARAMETR_WHERE,
-}cmd_find_list_err_t;
 /**
  * Handler coomand find
  * @param a_argc
@@ -454,15 +473,8 @@ void dap_notify_new_client_send_info(dap_events_socket_t *a_es, void *a_arg);
 
 int com_exec_cmd(int argc, char **argv, void **reply);
 
-
-typedef enum s_com_file_err{
-    DAP_CHAIN_NODE_CLI_COM_FILE_OK = 0,
-    DAP_CHAIN_NODE_CLI_COM_FILE_MEMORY_ERR,
-    DAP_CHAIN_NODE_CLI_COM_FILE_PARAM_ERR,
-    DAP_CHAIN_NODE_CLI_COM_FILE_SOURCE_FILE_ERR,
-    DAP_CHAIN_NODE_CLI_COM_FILE_DEST_FILE_ERR,
-    DAP_CHAIN_NODE_CLI_COM_FILE_NUM_ERR
-
-
-} s_com_file_err_t;
 int com_file(int a_argc, char ** a_argv, void **a_str_reply);
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/node-cli/include/dap_chain_node_cli_cmd_tx.h b/modules/node-cli/include/dap_chain_node_cli_cmd_tx.h
index 442f895e7edd3ad5173681ecfd8903cb0741744b..82b7c1b13ab404916a36d2a28e1f369591b43c0e 100644
--- a/modules/node-cli/include/dap_chain_node_cli_cmd_tx.h
+++ b/modules/node-cli/include/dap_chain_node_cli_cmd_tx.h
@@ -34,6 +34,40 @@ typedef struct dap_chain_tx_hash_processed_ht{
     UT_hash_handle hh;
 }dap_chain_tx_hash_processed_ht_t;
 
+typedef enum s_com_ledger_err{
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_OK = 0,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_INCOMPATIBLE_PARAMS_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_WALLET_ADDR_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_TRESHOLD_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_FIND_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_ID_NET_ADDR_DIF_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_GET_ERR,
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR,
+
+    /* add custom codes here */
+
+    DAP_CHAIN_NODE_CLI_COM_LEDGER_UNKNOWN /* MAX */
+} s_com_ledger_err_t;
+
+typedef enum s_com_token_err{
+    DAP_CHAIN_NODE_CLI_COM_TOKEN_OK = 0,
+    DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TOKEN_HASH_ERR,
+    DAP_CHAIN_NODE_CLI_COM_TOKEN_FOUND_ERR,
+
+    /* add custom codes here */
+
+    DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN /* MAX */
+} s_com_token_err_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed);
 
 /**
@@ -75,43 +109,18 @@ bool s_dap_chain_datum_tx_out_data(json_object* a_json_arr_reply,
  */
 int com_ledger(int a_argc, char ** a_argv, void **a_str_reply);
 
-typedef enum s_com_ledger_err{
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_OK = 0,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_PARAM_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_PARAM_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_INCOMPATIBLE_PARAMS_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_WALLET_ADDR_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_TRESHOLD_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_LACK_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_NET_FIND_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_ID_NET_ADDR_DIF_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_HASH_GET_ERR,
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_TX_HASH_ERR,
-
-    /* add custom codes here */
-
-    DAP_CHAIN_NODE_CLI_COM_LEDGER_UNKNOWN /* MAX */
-} s_com_ledger_err_t;
 /**
  * token command
  *
  */
 int com_token(int a_argc, char ** a_argv, void **a_str_reply);
 
-typedef enum s_com_token_err{
-    DAP_CHAIN_NODE_CLI_COM_TOKEN_OK = 0,
-    DAP_CHAIN_NODE_CLI_COM_TOKEN_PARAM_ERR,
-    DAP_CHAIN_NODE_CLI_COM_TOKEN_HASH_ERR,
-    DAP_CHAIN_NODE_CLI_COM_TOKEN_FOUND_ERR,
-
-    /* add custom codes here */
-
-    DAP_CHAIN_NODE_CLI_COM_TOKEN_UNKNOWN /* MAX */
-} s_com_token_err_t;
 /**
  * decree command
  *
  */
 int cmd_decree(int a_argc, char **a_argv, void **a_str_reply);
 
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/wallet/include/dap_chain_wallet.h b/modules/wallet/include/dap_chain_wallet.h
index 73c18b418c575b1e76d02ccbdba3cd1adb7f70a9..ddee0312dbedd1fae5893d8425e1e2b4b27425e5 100644
--- a/modules/wallet/include/dap_chain_wallet.h
+++ b/modules/wallet/include/dap_chain_wallet.h
@@ -43,6 +43,11 @@ typedef struct dap_chain_wallet{
     void        *_inheritor;
 } dap_chain_wallet_t;
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 typedef void (*dap_chain_wallet_opened_callback_t)(dap_chain_wallet_t *a_wallet, void *a_arg);
 
 int dap_chain_wallet_init();
@@ -101,3 +106,7 @@ int dap_chain_wallet_get_pkey_hash(dap_chain_wallet_t *a_wallet, dap_hash_fast_t
 char *dap_chain_wallet_get_pkey_str(dap_chain_wallet_t *a_wallet, const char *a_str_type);
 
 dap_list_t* dap_chain_wallet_get_local_addr();
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/wallet/include/dap_chain_wallet_cache.h b/modules/wallet/include/dap_chain_wallet_cache.h
index 779ec76d99e0f345b80290eb269f6455001dcada..4b05719a0c301e1beab0f2755bdf9390b38f354b 100644
--- a/modules/wallet/include/dap_chain_wallet_cache.h
+++ b/modules/wallet/include/dap_chain_wallet_cache.h
@@ -45,6 +45,10 @@ typedef struct dap_chain_wallet_cache_iter {
     void *cur_addr_cache;
 } dap_chain_wallet_cache_iter_t;
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int dap_chain_wallet_cache_init();
 int dap_chain_wallet_cache_deinit();
 
@@ -101,4 +105,9 @@ int dap_chain_wallet_cache_tx_find_outs(dap_chain_net_t *a_net, const char *a_to
 
 dap_chain_wallet_cache_iter_t *dap_chain_wallet_cache_iter_create(dap_chain_addr_t a_addr);
 void dap_chain_wallet_cache_iter_delete(dap_chain_wallet_cache_iter_t *a_iter);
-dap_chain_datum_tx_t *dap_chain_wallet_cache_iter_get(dap_chain_wallet_cache_iter_t *a_iter, dap_chain_wallet_getting_type_t a_type);
\ No newline at end of file
+dap_chain_datum_tx_t *dap_chain_wallet_cache_iter_get(dap_chain_wallet_cache_iter_t *a_iter, dap_chain_wallet_getting_type_t a_type);
+
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file
diff --git a/modules/wallet/include/dap_chain_wallet_ops.h b/modules/wallet/include/dap_chain_wallet_ops.h
index 90f610a1e837fb4213e57b59cbb15c7bb89abd6f..4e818c217c140eb3700c2ec39baaebaf48e4af3b 100644
--- a/modules/wallet/include/dap_chain_wallet_ops.h
+++ b/modules/wallet/include/dap_chain_wallet_ops.h
@@ -3,6 +3,14 @@
 #include "dap_chain.h"
 #include "dap_chain_wallet.h"
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 void dap_chain_wallet_op_tx_request(dap_chain_wallet_t * a_wallet, uint32_t a_wallet_key_idx, /// Sender's wallet and key index in it
                              dap_chain_t * a_chain_source, uint64_t a_value, /// Token source and daptoshi's value
                              dap_chain_t * a_chain_tx_request, dap_chain_addr_t a_destination ); ///  TX blockchain where to create new block
+
+#ifdef __cplusplus
+}
+#endif
\ No newline at end of file