From 3c2de4d0095a91b9d699e922fcfc6d76c312d837 Mon Sep 17 00:00:00 2001
From: "alexey.stratulat" <alexey.stratulat@demlabs.net>
Date: Wed, 24 Jan 2024 22:24:26 +0700
Subject: [PATCH] [*] Changes related to corrections to the tx_history command
 have been ported and a dump of the IN_REWARDS item has been added to the
 transaction datum.

---
 .../common/dap_json_rpc_chain_datum_tx.c       |  4 ++++
 .../common/dap_json_rpc_chain_datum_tx_items.c | 18 ++++++++++++++++++
 .../dap_json_rpc_chain_datum_tx_items.h        |  1 +
 modules/net/dap_chain_node_cli_cmd_tx.c        | 11 +++--------
 4 files changed, 26 insertions(+), 8 deletions(-)

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
index 0e9ae8475e..9548584edd 100644
--- a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c
+++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c
@@ -41,6 +41,10 @@ json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){
                 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_REWARD:
+                l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_REWARD");
+                l_obj_item_data = dap_chain_datum_tx_item_in_reward_to_json((dap_chain_tx_in_reward_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);
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
index 7688d3cee0..810857fb55 100644
--- 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
@@ -355,6 +355,24 @@ json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){
     return l_obj_in;
 }
 
+json_object* dap_chain_datum_tx_item_in_reward_to_json(dap_chain_tx_in_reward_t *a_in_reward){
+    json_object *l_jobj_ret = json_object_new_object();
+    char *l_hash_block = dap_hash_fast_to_str_new(&a_in_reward->block_hash);
+    if (!l_jobj_ret && !l_hash_block) {
+        json_object_put(l_jobj_ret);
+        DAP_DEL_Z(l_hash_block);
+        dap_json_rpc_allocation_error;
+        return NULL;
+    }
+    json_object *l_jobj_block_hash = json_object_new_string(l_hash_block);
+    DAP_DEL_Z(l_hash_block);
+    if (!l_jobj_block_hash) {
+        return NULL;
+    }
+    json_object_object_add(l_jobj_ret, "block_hash", l_jobj_block_hash);
+    return l_jobj_ret;
+}
+
 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) {
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
index fdc37b126e..4daa805633 100644
--- 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
@@ -30,6 +30,7 @@
 
 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_in_reward_to_json(dap_chain_tx_in_reward_t *a_in_reward);
 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);
diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c
index f9160c1128..0a8ea3adb8 100644
--- a/modules/net/dap_chain_node_cli_cmd_tx.c
+++ b/modules/net/dap_chain_node_cli_cmd_tx.c
@@ -284,11 +284,6 @@ static void s_tx_header_print(json_object* json_obj_datum, dap_chain_tx_hash_pro
 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;
-    };
-
     json_object* json_obj_datum = json_object_new_array();
     if (!json_obj_datum){
         log_it(L_CRITICAL, "Memory allocation error");
@@ -392,6 +387,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                     break;
                 case TX_ITEM_TYPE_OUT_COND: {
                     dap_chain_tx_out_cond_t *l_cond_prev = (dap_chain_tx_out_cond_t *)l_prev_out_union;
+                    l_src_subtype = l_cond_prev->header.subtype;
                     if (l_cond_prev->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE)
                         l_noaddr_token = l_native_ticker;
                     else {
@@ -399,7 +395,6 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                             l_is_unstake = true;
                             l_unstake_value = l_cond_prev->header.value;
                         }
-                        l_src_subtype = l_cond_prev->header.subtype;
                         l_noaddr_token = l_src_token;
                     }
                 } break;
@@ -414,7 +409,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
 
         // find OUT items
         bool l_header_printed = false;
-        uint256_t l_fee_sum = {};
+        uint256_t l_fee_sum = uint256_0;
         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();
@@ -522,7 +517,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain,
                 DAP_DELETE(l_value_str);
                 DAP_DELETE(l_coins_str);
             } else if (!l_src_addr || dap_chain_addr_compare(l_src_addr, a_addr)) {
-                if (!l_dst_addr && ((dap_chain_tx_out_cond_t *)it->data)->header.subtype == l_src_subtype)\
+                if (!l_dst_addr && ((dap_chain_tx_out_cond_t *)it->data)->header.subtype == l_src_subtype && l_src_subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE)
                     continue;
                 if (!l_src_addr && l_dst_addr && !dap_chain_addr_compare(l_dst_addr, &l_net_fee_addr))
                     continue;
-- 
GitLab