From ecbf9be8819da313d3abbe41bfd55e78adfc937d Mon Sep 17 00:00:00 2001
From: "daniil.frolov" <daniil.frolov@demlabs.net>
Date: Mon, 17 Jul 2023 18:37:38 +0700
Subject: [PATCH 1/3] ...

---
 modules/net/srv/dap_chain_net_srv.c         | 1 +
 modules/net/srv/include/dap_chain_net_srv.h | 1 +
 2 files changed, 2 insertions(+)

diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index 4556ef32e5..df48a10ca3 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -769,6 +769,7 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons
         return -4;
     }
     a_srv->grace_period = dap_config_get_item_uint32_default(g_config, a_config_section, "grace_period", 60);
+    a_srv->allow_free_srv = dap_config_get_item_bool_default(g_config, a_config_section, "allow_free_srv", false);
     int l_err_code = 0;
     dap_chain_node_addr_t *l_node_addr = NULL;
     l_node_addr = dap_chain_net_get_cur_addr(l_net);
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index db494599b1..ef2e03ce1e 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -246,6 +246,7 @@ typedef struct dap_chain_net_srv
     dap_chain_net_srv_abstract_t srv_common;
     dap_chain_net_srv_price_t *pricelist;
 
+    bool allow_free_srv;
     uint32_t grace_period;
     pthread_mutex_t banlist_mutex;
     dap_chain_net_srv_banlist_item_t *ban_list;
-- 
GitLab


From ea29e18821ba75419b36962ba556a1b397ce18c5 Mon Sep 17 00:00:00 2001
From: "daniil.frolov" <daniil.frolov@demlabs.net>
Date: Tue, 18 Jul 2023 18:41:29 +0700
Subject: [PATCH 2/3] Add price validating in price searching

---
 .../dap_stream_ch_chain_net_srv.c             | 28 +++++++++++--------
 modules/net/srv/dap_chain_net_srv.c           | 15 ++++++++++
 2 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
index 1e330ae02d..8787918996 100644
--- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
+++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c
@@ -269,22 +269,21 @@ static void s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_
     l_usage->net = l_net;
     l_usage->service = l_srv;
 
-
-    dap_chain_net_srv_grace_t *l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t);
-    l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, a_request_size);
-    memcpy(l_grace->request, a_request, a_request_size);
-    l_grace->request_size = a_request_size;
-    l_grace->ch_uuid = a_ch->uuid;
-    l_grace->stream_worker = a_ch->stream_worker;
-    l_grace->usage = l_usage;
-
     if (l_srv->pricelist){
         // not free service
+        log_it( L_INFO, "Valid pricelist is founded. Start service in pay mode.");
+        dap_chain_net_srv_grace_t *l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t);
+        l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, a_request_size);
+        memcpy(l_grace->request, a_request, a_request_size);
+        l_grace->request_size = a_request_size;
+        l_grace->ch_uuid = a_ch->uuid;
+        l_grace->stream_worker = a_ch->stream_worker;
+        l_grace->usage = l_usage;
         s_grace_period_start(l_grace);
-    } else {
+    } else if (l_srv->allow_free_srv){
         // Start service for free
-        log_it( L_INFO, "Service provide for free");
-        l_grace->usage->is_free = true;
+        log_it( L_INFO, "Can't find a valid pricelist. Service provide for free");
+        l_usage->is_free = true;
         size_t l_success_size = sizeof (dap_stream_ch_chain_net_srv_pkt_success_hdr_t );
         dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t,
                                                                               l_success_size);
@@ -295,6 +294,11 @@ static void s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_
         if (l_usage->service->callbacks.response_success)
             l_usage->service->callbacks.response_success(l_usage->service, l_usage->id,  l_usage->client, NULL, 0);
         DAP_DELETE(l_success);
+    }else {
+        log_it( L_INFO, "No pricelists. Free service sharing is not allowed. Service stop.");
+        dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err));
+        if (l_srv && l_srv->callbacks.response_error)
+            l_srv->callbacks.response_error(l_srv, 0, NULL, &l_err, sizeof(l_err));
     }
     return;
 }
diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index df48a10ca3..862654ad11 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -786,11 +786,26 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons
             dap_chain_net_srv_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_price_t);
             l_price->net = l_net;
             l_price->net_name = dap_strdup(l_net->pub.name);
+            uint256_t l_max_price = GET_256_FROM_64((uint64_t)100); // Change this value when max price wil be calculated
+            if (!compare256(l_order->price, uint256_0) || l_order->units == 0 ){
+                DAP_DELETE(l_price);
+                continue;
+            }
             l_price->value_datoshi = l_order->price;
             dap_stpcpy(l_price->token, l_order->price_ticker);
             l_price->units = l_order->units;
             l_price->units_uid = l_order->price_unit;
+            if (compare256(l_max_price, uint256_0)){
+                uint256_t l_price_unit = uint256_0;
+                DIV_256(l_price->value_datoshi,  GET_256_FROM_64(l_order->units), &l_price_unit);
+                if (compare256(l_price_unit, l_max_price)>0){
+                    DAP_DELETE(l_price);
+                    continue;
+                }
+            }
+
             l_price->wallet = l_wallet;
+            DL_APPEND(a_srv->pricelist, l_price);
             break;
         }
         DAP_DELETE(l_order);
-- 
GitLab


From ad9cc6c84e4832126a8522b55958c27aa1c1f10c Mon Sep 17 00:00:00 2001
From: "daniil.frolov" <daniil.frolov@demlabs.net>
Date: Fri, 21 Jul 2023 20:19:34 +0700
Subject: [PATCH 3/3] change max price

---
 modules/net/srv/dap_chain_net_srv.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c
index 862654ad11..3fad147ed0 100644
--- a/modules/net/srv/dap_chain_net_srv.c
+++ b/modules/net/srv/dap_chain_net_srv.c
@@ -786,7 +786,7 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons
             dap_chain_net_srv_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_price_t);
             l_price->net = l_net;
             l_price->net_name = dap_strdup(l_net->pub.name);
-            uint256_t l_max_price = GET_256_FROM_64((uint64_t)100); // Change this value when max price wil be calculated
+            uint256_t l_max_price = GET_256_FROM_64((uint64_t)1000000000000000); // Change this value when max price wil be calculated
             if (!compare256(l_order->price, uint256_0) || l_order->units == 0 ){
                 DAP_DELETE(l_price);
                 continue;
-- 
GitLab