diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 72982d1f9ae47f60ca53d6e33a69e4424bb1924f..c6a68ced3c046d6a7718cff304a4c22993afd761 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -250,6 +250,9 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) const char* l_continent_str = NULL; dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-continent", &l_continent_str); + const char *l_units_str = NULL; + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-units", &l_units_str); + int8_t l_continent_num = dap_chain_net_srv_order_continent_to_num(l_continent_str); char *l_order_hash_hex_str; @@ -467,7 +470,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) }else if( dap_strcmp( l_order_str, "create" ) == 0 ){ const char *l_order_cert_name = NULL; dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-cert", &l_order_cert_name); - if ( l_srv_uid_str && l_price_str && l_price_token_str && l_price_unit_str) { + if ( l_srv_uid_str && l_price_str && l_price_token_str && l_price_unit_str && l_units_str) { dap_chain_net_srv_uid_t l_srv_uid={{0}}; dap_chain_node_addr_t l_node_addr={0}; dap_chain_hash_fast_t l_tx_cond_hash={{0}}; @@ -514,6 +517,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) dap_chain_hash_fast_from_str (l_tx_cond_hash_str, &l_tx_cond_hash); l_price = dap_chain_balance_scan(l_price_str); l_price_unit.uint32 = (uint32_t) atol ( l_price_unit_str ); + uint64_t l_units = atoi(l_units_str); strncpy(l_price_token, l_price_token_str, DAP_CHAIN_TICKER_SIZE_MAX - 1); size_t l_ext_len = l_ext? strlen(l_ext) + 1 : 0; // get cert to order sign @@ -540,7 +544,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) // create order char * l_order_new_hash_str = dap_chain_net_srv_order_create( l_net,l_direction, l_srv_uid, l_node_addr,l_tx_cond_hash, &l_price, l_price_unit, - l_price_token, l_expires, (uint8_t *)l_ext, l_ext_len, l_region_str, l_continent_num, l_key); + l_price_token, l_expires, (uint8_t *)l_ext, l_ext_len, l_units, l_region_str, l_continent_num, l_key); if(l_cert) dap_cert_delete(l_cert); if (l_order_new_hash_str) @@ -747,6 +751,51 @@ static bool s_pay_verificator_callback(dap_ledger_t * a_ledger, dap_chain_tx_out return true; } +int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, const char *a_config_section){ + const char *l_wallet_path = dap_config_get_item_str_default(g_config, "resources", "wallets_path", NULL); + const char *l_wallet_name = dap_config_get_item_str_default(g_config, a_config_section, "wallet", NULL); + const char *l_net_name = dap_config_get_item_str_default(g_config, a_config_section, "net", NULL); + if (!l_wallet_path || !l_wallet_name || l_net_name){ + return -2; + } + dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, l_wallet_path); + if (!l_wallet) { + return -3; + } + dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_name); + if (!l_net) { + return -4; + } + a_srv->grace_period = dap_config_get_item_uint32_default(g_config, a_config_section, "grace_period", 60); + 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); + if (!l_node_addr) + return -1; + size_t l_orders_count = 0; + char *l_gdb_order_group = dap_chain_net_srv_order_get_gdb_group(l_net); + dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_gdb_order_group, &l_orders_count); + for (size_t i=0; i < l_orders_count; i++){ + l_err_code = -4; + dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len); + if (l_order->node_addr.uint64 == l_node_addr->uint64) { + l_err_code = 0; + 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); + 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; + l_price->wallet = l_wallet; + break; + } + DAP_DELETE(l_order); + } + dap_global_db_objs_delete(l_orders, l_orders_count); + return l_err_code; +} + int dap_chain_net_srv_parse_pricelist(dap_chain_net_srv_t *a_srv, const char *a_config_section) { int ret = 0; @@ -861,6 +910,7 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, l_sdata->uid = l_uid; strncpy(l_sdata->name, a_config_section, sizeof(l_sdata->name) - 1); l_sdata->srv = l_srv; + dap_chain_net_srv_price_apply_from_my_order(l_srv, a_config_section); dap_chain_net_srv_parse_pricelist(l_srv, a_config_section); HASH_ADD(hh, s_srv_list, uid, sizeof(l_srv->uid), l_sdata); }else{ diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index f79f08d30e8c50e261118911d4431df2bf11900e..00c9494de16aabfefbe9ce322f1352c7bf3fae44 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -302,13 +302,14 @@ char * dap_chain_net_srv_order_create( dap_time_t a_expires, // TS when the service expires const uint8_t *a_ext, uint32_t a_ext_size, + uint64_t a_units, const char *a_region, int8_t a_continent_num, dap_enc_key_t *a_key ) { dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_compose(a_net, a_direction, a_srv_uid, a_node_addr, a_tx_cond_hash, a_price, - a_price_unit, a_price_ticker, a_expires, a_ext, a_ext_size, + a_price_unit, a_price_ticker, a_expires, a_ext, a_ext_size, a_units, a_region, a_continent_num, a_key); if (!l_order) return NULL; @@ -328,6 +329,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(dap_chain_net_t *a_ne dap_time_t a_expires, // TS when the service expires const uint8_t *a_ext, uint32_t a_ext_size, + uint64_t a_units, const char *a_region, int8_t a_continent_num, dap_enc_key_t *a_key @@ -368,6 +370,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(dap_chain_net_t *a_ne if ( a_price_ticker) strncpy(l_order->price_ticker, a_price_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1); + l_order->units = a_units; dap_sign_t *l_sign = dap_sign_create(a_key, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size, 0); if (!l_sign) { DAP_DELETE(l_order); @@ -612,6 +615,7 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d } else dap_string_append_printf(a_str_out, " ext: 0x0\n"); + dap_string_append_printf(a_str_out, " units: %zu\n", a_order->units); dap_sign_t *l_sign = (dap_sign_t*)((byte_t*)a_order->ext_n_sign + a_order->ext_size); dap_hash_fast_t l_sign_pkey = {0}; dap_sign_get_pkey_hash(l_sign, &l_sign_pkey); @@ -689,4 +693,3 @@ void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_sto l_notifier->cb_arg = a_cb_arg; s_order_notify_callbacks = dap_list_append(s_order_notify_callbacks, l_notifier); } - diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index 53db3a75b0f8dbb20b38f303711514b75882822d..05e1644b3e6198759dba4ad2887e5963e9b52e0c 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -302,7 +302,9 @@ dap_chain_datum_tx_receipt_t * dap_chain_net_srv_issue_receipt(dap_chain_net_srv dap_chain_net_srv_price_t * a_price, const void * a_ext, size_t a_ext_size); uint8_t dap_stream_ch_chain_net_srv_get_id(); -int dap_chain_net_srv_parse_pricelist(dap_chain_net_srv_t *a_srv, const char *a_config_section); + +//int dap_chain_net_srv_parse_pricelist(dap_chain_net_srv_t *a_srv, const char *a_config_section); +int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, const char *a_config_section); DAP_STATIC_INLINE const char * dap_chain_net_srv_price_unit_uid_to_str( dap_chain_net_srv_price_unit_uid_t a_uid ) { 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 f6567816284835fc330a92c5831590209fb1d144..8aaed003363eee4eb69d0f6dacf64c46f5cec51c 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -65,7 +65,8 @@ typedef struct dap_chain_net_srv_order uint256_t price; // service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service uint32_t ext_size; - byte_t free_space[128]; // for future changes + uint64_t units; + byte_t free_space[120]; // for future changes uint8_t ext_n_sign[]; } DAP_ALIGN_PACKED dap_chain_net_srv_order_t; @@ -132,6 +133,7 @@ char *dap_chain_net_srv_order_create(dap_chain_net_t * a_net, dap_time_t a_expires, // TS when the service expires const uint8_t *a_ext, uint32_t a_ext_size, + uint64_t a_units, const char *a_region, int8_t a_continent_num, dap_enc_key_t *a_key @@ -149,6 +151,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( dap_time_t a_expires, // TS when the service expires const uint8_t *a_ext, uint32_t a_ext_size, + uint64_t a_units, const char *a_region, int8_t a_continent_num, dap_enc_key_t *a_key diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index 65da564e581fa443e3d440b954fbd206b9272e68..971586fe17c915642433bcc96a7e79e80ac88138 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -47,7 +47,7 @@ int dap_chain_net_srv_datum_init() "\tLoad datum custum from file to mempool.\n\n"); s_srv_datum = DAP_NEW_Z(dap_chain_net_srv_t); s_srv_datum->uid.uint64 = DAP_CHAIN_NET_SRV_DATUM_ID; - int l_net_count = dap_chain_net_srv_parse_pricelist(s_srv_datum, "srv_datum"); + dap_chain_net_srv_price_apply_from_my_order(s_srv_datum, "srv_datum"); dap_chain_net_srv_price_t *l_price; DL_FOREACH(s_srv_datum->pricelist, l_price) { dap_chain_net_t *l_net = l_price->net; diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 93d481ac2cecce640f9fa0d959040aaa69ecd275..5a8d9b359436f45579ad2c2e775c1325282b0c71 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -871,7 +871,7 @@ char *s_stake_order_create(dap_chain_net_t *a_net, uint256_t *a_fee, dap_enc_key dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; char *l_order_hash_str = dap_chain_net_srv_order_create(a_net, l_dir, l_uid, *l_node_addr, l_tx_hash, a_fee, l_unit, l_native_ticker, 0, - NULL, 0, NULL, 0, a_key); + NULL, 0, 1, NULL, 0, a_key); return l_order_hash_str; } diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index c420689a50c39645d0f37e64912b4fbafbb67d0e..47b9fcaf51a361f43d5c50f14e4edd85d5f13120 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -902,7 +902,7 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha uint32_t l_ext_size = sizeof(dap_srv_xchange_order_ext_t); char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_SELL, l_uid, *l_node_addr, l_tx_hash, &a_price->datoshi_sell, l_unit, a_price->token_sell, 0, - (uint8_t *)&l_ext, l_ext_size, NULL, 0, a_price->wallet_key); + (uint8_t *)&l_ext, l_ext_size, 0, NULL, 0, a_price->wallet_key); return l_order_hash_str; }