From 1bd9372aa17c7a0e9a0403cdd1618aacfb1a3900 Mon Sep 17 00:00:00 2001
From: "roman.khlopkov" <roman.khlopkov@demlabs.net>
Date: Wed, 30 Oct 2024 18:46:02 +0300
Subject: [PATCH] [*] OUT_COND sizing fix & other

---
 modules/chain/include/dap_chain_common.h      |  2 +-
 .../include/dap_chain_datum_tx_out_cond.h     |  2 --
 .../include/dap_chain_datum_tx_receipt.h      |  2 --
 modules/net-srv/dap_chain_net_srv.c           | 17 ++++++----
 .../net-srv/include/dap_chain_net_srv_order.h |  5 +--
 modules/node-cli/dap_chain_node_cli_cmd.c     | 34 ++++++++-----------
 6 files changed, 27 insertions(+), 35 deletions(-)

diff --git a/modules/chain/include/dap_chain_common.h b/modules/chain/include/dap_chain_common.h
index edd061b252..ab2cf1b055 100644
--- a/modules/chain/include/dap_chain_common.h
+++ b/modules/chain/include/dap_chain_common.h
@@ -129,7 +129,7 @@ typedef union {
     uint8_t raw[8];
     uint64_t raw_ui64;
     uint64_t uint64;
-} dap_chain_srv_uid_t;
+} DAP_ALIGN_PACKED dap_chain_srv_uid_t;
 
 extern const dap_chain_srv_uid_t c_dap_chain_srv_uid_null;
 extern const dap_chain_cell_id_t c_dap_chain_cell_id_null;
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 dfe9d5d967..c3e7b9922b 100644
--- a/modules/datum/include/dap_chain_datum_tx_out_cond.h
+++ b/modules/datum/include/dap_chain_datum_tx_out_cond.h
@@ -83,9 +83,7 @@ typedef struct dap_chain_tx_out_cond {
         dap_time_t ts_expires;
         /// Service uid that only could be used for this out
         dap_chain_srv_uid_t srv_uid;
-#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
         byte_t padding[8];
-#endif
     } DAP_ALIGN_PACKED header;
     union {
         /// Structure with specific for service pay condition subtype
diff --git a/modules/datum/include/dap_chain_datum_tx_receipt.h b/modules/datum/include/dap_chain_datum_tx_receipt.h
index 4975a9c9b7..6ab5d94fd8 100644
--- a/modules/datum/include/dap_chain_datum_tx_receipt.h
+++ b/modules/datum/include/dap_chain_datum_tx_receipt.h
@@ -29,9 +29,7 @@
 
 typedef struct dap_chain_receipt_info {
     dap_chain_srv_uid_t srv_uid; // Service UID
-#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
     uint64_t addition;
-#endif
     dap_chain_net_srv_price_unit_uid_t units_type;
     byte_t version;
     byte_t padding[3];
diff --git a/modules/net-srv/dap_chain_net_srv.c b/modules/net-srv/dap_chain_net_srv.c
index 900babd5f2..fd149f2ed8 100644
--- a/modules/net-srv/dap_chain_net_srv.c
+++ b/modules/net-srv/dap_chain_net_srv.c
@@ -314,11 +314,12 @@ static int s_cli_net_srv( int argc, char **argv, void **a_str_reply)
                         return -18;
                     }
                 }
-
-                if (l_srv_uid_str && dap_id_uint64_parse(l_srv_uid_str ,&l_srv_uid.uint64)) {
+                uint64_t l_64 = 0;
+                if (l_srv_uid_str && dap_id_uint64_parse(l_srv_uid_str, &l_64)) {
                     dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't recognize '%s' string as 64-bit id, hex or dec.", l_srv_uid_str);
                     return -21;
                 }
+                l_srv_uid.uint64 = l_64;
 
                 if ( l_price_min_str )
                     l_price_min = dap_chain_balance_scan(l_price_min_str);
@@ -431,13 +432,15 @@ static int s_cli_net_srv( int argc, char **argv, void **a_str_reply)
 
                     if (l_expires_str)
                         l_expires = (dap_time_t ) atoll( l_expires_str);
-                    if (l_srv_uid_str && dap_id_uint64_parse(l_srv_uid_str ,&l_srv_uid.uint64)) {
+                    uint64_t l_64 = 0;
+                    if (l_srv_uid_str && dap_id_uint64_parse(l_srv_uid_str, &l_64)) {
                         dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't recognize '%s' string as 64-bit id, hex or dec.", l_srv_uid_str);
                         return -21;
-                    }else if (!l_srv_uid_str){
+                    } else if (!l_srv_uid_str){
                         dap_cli_server_cmd_set_reply_text(a_str_reply, "Parameter -srv_uid is required.");
                         return -22;
                     }
+                    l_srv_uid.uint64 = l_64;
                     if (l_node_addr_str){
                         if (dap_chain_node_addr_str_check(l_node_addr_str)) {
                             dap_chain_node_addr_from_str( &l_node_addr, l_node_addr_str );
@@ -543,8 +546,8 @@ static int s_cli_net_srv( int argc, char **argv, void **a_str_reply)
                 return -16;
             }
 
-            dap_chain_srv_uid_t l_srv_uid={{0}};
-            if (l_srv_uid_str && dap_id_uint64_parse(l_srv_uid_str ,&l_srv_uid.uint64)) {
+            uint64_t l_64 = 0;
+            if (l_srv_uid_str && dap_id_uint64_parse(l_srv_uid_str, &l_64)) {
                 dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't recognize '%s' string as 64-bit id, hex or dec.", l_srv_uid_str);
                 dap_string_free(l_string_ret, true);
                 return -21;
@@ -553,7 +556,7 @@ static int s_cli_net_srv( int argc, char **argv, void **a_str_reply)
                 dap_string_free(l_string_ret, true);
                 return -22;
             }
-
+            dap_chain_srv_uid_t l_srv_uid= { .uint64 = l_64};
             dap_chain_net_srv_ch_remain_service_store_t *l_remain_service = NULL;
             size_t l_remain_service_size = 0;
             char *l_remain_limits_gdb_group =  dap_strdup_printf( "local.%s.0x%016"DAP_UINT64_FORMAT_x".remain_limits.%s",
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 aabedab8fb..de6eae0917 100644
--- a/modules/net-srv/include/dap_chain_net_srv_order.h
+++ b/modules/net-srv/include/dap_chain_net_srv_order.h
@@ -29,13 +29,10 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_chain_common.h"
 #include "dap_chain_net_srv.h"
 
-typedef struct dap_chain_net_srv_order
-{
+typedef struct dap_chain_net_srv_order {
     uint16_t version;
     dap_chain_srv_uid_t srv_uid; // Service UID
-#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
     byte_t padding[8];
-#endif
     dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE
     byte_t padding_dir[3];
     dap_chain_node_addr_t node_addr; // Node address that servs the order (if present)
diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c
index 60d70207a2..c3d3e8c564 100644
--- a/modules/node-cli/dap_chain_node_cli_cmd.c
+++ b/modules/node-cli/dap_chain_node_cli_cmd.c
@@ -6384,12 +6384,10 @@ int s_json_rpc_tx_parse_json(dap_chain_net_t *a_net, dap_chain_t *a_chain, json_
                     log_it(L_ERROR, "Json TX: bad price_unit in OUT_COND_SUBTYPE_SRV_PAY");
                     break;
                 }
-                dap_chain_srv_uid_t l_srv_uid;
-                if(!s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_srv_uid.uint64)){
-                    // Default service DAP_CHAIN_NET_SRV_VPN_ID
-                    l_srv_uid.uint64 = 0x0000000000000001;
-                }
-
+                // Default service DAP_CHAIN_NET_SRV_VPN_ID
+                uint64_t l_64 = 0x0000000000000001;
+                s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_64);
+                dap_chain_srv_uid_t l_srv_uid = { .uint64 = l_64};
                 // From "wallet" or "cert"
                 dap_pkey_t *l_pkey = s_json_get_pkey(l_json_item_obj);
                 if(!l_pkey) {
@@ -6415,12 +6413,10 @@ int s_json_rpc_tx_parse_json(dap_chain_net_t *a_net, dap_chain_t *a_chain, json_
             }
                 break;
             case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: {
-
-                dap_chain_srv_uid_t l_srv_uid;
-                if(!s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_srv_uid.uint64)) {
-                    // Default service DAP_CHAIN_NET_SRV_XCHANGE_ID
-                    l_srv_uid.uint64 = 0x2;
-                }
+                // Default service DAP_CHAIN_NET_SRV_XCHANGE_ID
+                uint64_t l_64 = 0x0000000000000002;
+                s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_64);
+                dap_chain_srv_uid_t l_srv_uid = { .uint64 = l_64};
                 dap_chain_net_t *l_net = dap_chain_net_by_name(s_json_get_text(l_json_item_obj, "net"));
                 if(!l_net) {
                     log_it(L_ERROR, "Json TX: bad net in OUT_COND_SUBTYPE_SRV_XCHANGE");
@@ -6453,11 +6449,10 @@ int s_json_rpc_tx_parse_json(dap_chain_net_t *a_net, dap_chain_t *a_chain, json_
             }
                 break;
             case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE:{
-                dap_chain_srv_uid_t l_srv_uid;
-                if(!s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_srv_uid.uint64)) {
-                    // Default service DAP_CHAIN_NET_SRV_STAKE_ID
-                    l_srv_uid.uint64 = 0x13;
-                }
+                // Default service DAP_CHAIN_NET_SRV_STAKE_ID
+                uint64_t l_64 = 0x0000000000000013;
+                s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_64);
+                dap_chain_srv_uid_t l_srv_uid = { .uint64 = l_64};
                 uint256_t l_value = { };
                 if(!s_json_get_uint256(l_json_item_obj, "value", &l_value) || IS_ZERO_256(l_value)) {
                     log_it(L_ERROR, "Json TX: bad value in OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE");
@@ -6535,11 +6530,12 @@ int s_json_rpc_tx_parse_json(dap_chain_net_t *a_net, dap_chain_t *a_chain, json_
         }
             break;
         case TX_ITEM_TYPE_RECEIPT: {
-            dap_chain_srv_uid_t l_srv_uid;
-            if(!s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_srv_uid.uint64)) {
+            uint64_t l_64 = 0;
+            if (!s_json_get_srv_uid(l_json_item_obj, "service_id", "service", &l_64)) {
                 log_it(L_ERROR, "Json TX: bad service_id in TYPE_RECEIPT");
                 break;
             }
+            dap_chain_srv_uid_t l_srv_uid = { .uint64 = l_64 };
             dap_chain_net_srv_price_unit_uid_t l_price_unit;
             if(!s_json_get_unit(l_json_item_obj, "price_unit", &l_price_unit)) {
                 log_it(L_ERROR, "Json TX: bad price_unit in TYPE_RECEIPT");
-- 
GitLab