From cb190e9260167e1ac7cf8b4ea4c5c852e7b7c2a9 Mon Sep 17 00:00:00 2001
From: "roman.khlopkov" <roman.khlopkov@demlabs.net>
Date: Mon, 17 Mar 2025 13:14:11 +0300
Subject: [PATCH] [*] Hardfork bugfixes

---
 .../consensus/esbocs/dap_chain_cs_esbocs.c    |  2 +-
 modules/ledger/dap_chain_ledger_tx.c          | 10 ++-
 modules/net/dap_chain_node.c                  | 63 +++++++++----------
 3 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 8c81fb4807..745ff1db67 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -896,7 +896,7 @@ static dap_list_t *s_get_validators_list(dap_chain_esbocs_t *a_esbocs, dap_hash_
     dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(a_esbocs);
     dap_list_t *l_ret = NULL;
     dap_list_t *l_validators = NULL;
-    if (!l_esbocs_pvt->poa_mode) {
+    if (l_esbocs_pvt->poa_mode) { // UNDO it after debug
         if (a_excluded_list_size) {
             l_validators =  dap_chain_net_srv_stake_get_validators(a_esbocs->chain->net_id, false, NULL);
             uint16_t l_excluded_num = *a_excluded_list;
diff --git a/modules/ledger/dap_chain_ledger_tx.c b/modules/ledger/dap_chain_ledger_tx.c
index 9e4accc59b..bb83939cd3 100644
--- a/modules/ledger/dap_chain_ledger_tx.c
+++ b/modules/ledger/dap_chain_ledger_tx.c
@@ -266,6 +266,10 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger,
             return DAP_LEDGER_TX_CHECK_FOR_REMOVING_CANT_FIND_TX;
         }
     }
+
+    if (a_ledger->is_hardfork_state)
+        return DAP_LEDGER_CHECK_OK;
+
 /*
  * Steps of checking for current transaction tx2 and every previous transaction tx1:
  * 1. valid(tx2.dap_chain_datum_tx_sig.pkey)
@@ -294,7 +298,7 @@ static int s_tx_cache_check(dap_ledger_t *a_ledger,
     int l_prev_tx_count = 0;
 
     // 1. Verify signature in current transaction
-    if (!a_from_threshold && !a_ledger->is_hardfork_state && dap_chain_datum_tx_verify_sign(a_tx, 0))
+    if (!a_from_threshold && dap_chain_datum_tx_verify_sign(a_tx, 0))
         return DAP_LEDGER_CHECK_NOT_ENOUGH_VALID_SIGNS;
 
     // ----------------------------------------------------------------
@@ -1264,6 +1268,10 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha
 
     if (a_ledger->is_hardfork_state) {
         TX_ITEM_ITER_TX(l_item, l_tx_item_size, a_tx) {
+            if (*l_item == TX_ITEM_TYPE_OUT_EXT || *l_item == TX_ITEM_TYPE_OUT_COND) {
+                l_list_tx_out = dap_list_append(l_list_tx_out, l_item);
+                continue;
+            }
             if (*l_item != TX_ITEM_TYPE_TSD)
                 continue;
             dap_tsd_t *l_tsd = (dap_tsd_t *)((dap_chain_tx_tsd_t *)l_item)->tsd;
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index 538969e9a5..baf3f110d7 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -551,6 +551,27 @@ int dap_chain_node_hardfork_prepare(dap_chain_t *a_chain, dap_time_t a_last_bloc
     return 0;
 }
 
+static int s_tx_trackers_add(dap_chain_datum_tx_t **a_tx, dap_list_t *a_trackers)
+{
+    for (dap_list_t *it = a_trackers; it; it = it->next) {
+        dap_ledger_tracker_t *l_tracker = it->data;
+        dap_chain_tx_tsd_t *l_tracker_hash_tsd = dap_chain_datum_tx_item_tsd_create(&l_tracker->voting_hash, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_VOTING_HASH, sizeof(dap_hash_fast_t));
+        if (!l_tracker_hash_tsd)
+            return -1;
+        if (dap_chain_datum_tx_add_item(a_tx, l_tracker_hash_tsd) != 1)
+            return -2;
+        for (dap_ledger_tracker_item_t *l_item = l_tracker->items; l_item; l_item = l_item->next) {
+            dap_ledger_hardfork_tracker_t l_hardfork_tracker = { .pkey_hash = l_item->pkey_hash, .coloured_value = l_item->coloured_value };
+            dap_chain_tx_tsd_t *l_tracker_tsd = dap_chain_datum_tx_item_tsd_create(&l_hardfork_tracker, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER, sizeof(dap_ledger_hardfork_tracker_t));
+            if (!l_tracker_tsd)
+                return -3;
+            if (dap_chain_datum_tx_add_item(a_tx, l_tracker_tsd) != 1)
+                return -4;
+        }
+    }
+    return 0;
+}
+
 dap_chain_datum_t *s_datum_tx_create(dap_chain_addr_t *a_addr, const char *a_ticker, uint256_t a_value, dap_list_t *a_trackers)
 {
     dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create();
@@ -560,17 +581,9 @@ dap_chain_datum_t *s_datum_tx_create(dap_chain_addr_t *a_addr, const char *a_tic
         dap_chain_datum_tx_delete(l_tx);
         return NULL;
     }
-    for (dap_list_t *it = a_trackers; it; it = it->next) {
-        dap_ledger_tracker_t *l_tracker = it->data;
-        dap_chain_tx_tsd_t *l_tracker_tsd = dap_chain_datum_tx_item_tsd_create(l_tracker, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER, sizeof(dap_ledger_tracker_t));
-        if (!l_tracker_tsd) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-        if (dap_chain_datum_tx_add_item(&l_tx, l_tracker_tsd) != 1) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
+    if (s_tx_trackers_add(&l_tx, a_trackers)) {
+        dap_chain_datum_tx_delete(l_tx);
+        return NULL;
     }
     dap_chain_datum_t *l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, dap_chain_datum_tx_get_size(l_tx));
     dap_chain_datum_tx_delete(l_tx);
@@ -608,29 +621,9 @@ dap_chain_datum_t *s_cond_tx_create(dap_chain_tx_out_cond_t *a_cond, dap_chain_t
         dap_chain_datum_tx_delete(l_tx);
         return NULL;
     }
-    for (dap_list_t *it = a_trackers; it; it = it->next) {
-        dap_ledger_tracker_t *l_tracker = it->data;
-        dap_chain_tx_tsd_t *l_tracker_hash_tsd = dap_chain_datum_tx_item_tsd_create(&l_tracker->voting_hash, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_VOTING_HASH, sizeof(dap_hash_fast_t));
-        if (!l_tracker_hash_tsd) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-        if (dap_chain_datum_tx_add_item(&l_tx, l_tracker_hash_tsd) != 1) {
-            dap_chain_datum_tx_delete(l_tx);
-            return NULL;
-        }
-        for (dap_ledger_tracker_item_t *l_item = l_tracker->items; l_item; l_item = l_item->next) {
-            dap_ledger_hardfork_tracker_t l_hardfork_tracker = { .pkey_hash = l_item->pkey_hash, .coloured_value = l_item->coloured_value };
-            dap_chain_tx_tsd_t *l_tracker_tsd = dap_chain_datum_tx_item_tsd_create(&l_hardfork_tracker, DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER, sizeof(dap_ledger_hardfork_tracker_t));
-            if (!l_tracker_tsd) {
-                dap_chain_datum_tx_delete(l_tx);
-                return NULL;
-            }
-            if (dap_chain_datum_tx_add_item(&l_tx, l_tracker_tsd) != 1) {
-                dap_chain_datum_tx_delete(l_tx);
-                return NULL;
-            }
-        }
+    if (s_tx_trackers_add(&l_tx, a_trackers)) {
+        dap_chain_datum_tx_delete(l_tx);
+        return NULL;
     }
     dap_chain_datum_t *l_datum_tx = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, dap_chain_datum_tx_get_size(l_tx));
     dap_chain_datum_tx_delete(l_tx);
@@ -980,7 +973,7 @@ int s_hardfork_check(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t a_
                 } break;
                 case DAP_CHAIN_DATUM_TX_TSD_TYPE_HARDFORK_TRACKER: {
                     if (l_tsd->size != sizeof(dap_ledger_hardfork_tracker_t)) {
-                        log_it(L_WARNING, "Illegal harfork datum tx TSD VOTING_HASH size %u", l_tsd->size);
+                        log_it(L_WARNING, "Illegal harfork datum tx TSD TRACKER size %u", l_tsd->size);
                         m_ret_clear(-8);
                     }
                     if (!l_tracker_current) {
-- 
GitLab