diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 8a997d0319e3778a2a34d13bcdcc0cee112fcc7a..4556ef32e5a89f944b60a2c84dc97aaed2357a19 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -252,6 +252,9 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) int8_t l_continent_num = dap_chain_net_srv_order_continent_to_num(l_continent_str); + const char *l_units_str = NULL; + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-units", &l_units_str); + char *l_order_hash_hex_str; char *l_order_hash_base58_str; // datum hash may be in hex or base58 format @@ -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) @@ -749,6 +753,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; @@ -878,7 +927,8 @@ 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_parse_pricelist(l_srv, a_config_section); + 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); if (l_srv->pricelist) dap_chain_ledger_tx_add_notify(l_srv->pricelist->net->pub.ledger, dap_stream_ch_chain_net_srv_tx_cond_added_cb, NULL); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index bc02a41a4c75c52ebf22128cc8053ebf37af163e..0bce760dbe92f80f10ac00d9ce2045d084c69543 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -307,13 +307,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; @@ -333,6 +334,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 @@ -381,6 +383,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); @@ -634,6 +637,7 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d dap_sign_get_pkey_hash(l_sign, &l_sign_pkey); char *l_sign_pkey_hash_str = dap_hash_fast_to_str_new(&l_sign_pkey); dap_string_append_printf(a_str_out, " pkey: %s\n", l_sign_pkey_hash_str); + dap_string_append_printf(a_str_out, " units: %zu\n", a_order->units); DAP_DELETE(l_sign_pkey_hash_str); // order state /* { diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index 08db33f999802ef1582c25ee15c9d3e5ad283568..db494599b1f98d91e223da0869d1a5dd2d208b40 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -304,6 +304,7 @@ dap_chain_datum_tx_receipt_t * dap_chain_net_srv_issue_receipt(dap_chain_net_srv 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_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 f4e35a0afcd926d95e91cde15df89c675908faa5..ed5776f87e777b5bd1b2663f672b0a0f4f892167 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -51,7 +51,7 @@ int dap_chain_net_srv_datum_init() return -1; } 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 854480ccb02caf2ed4bb48c453404d934caf8433..b09e976a838d742deafaf717216e63736a551fb1 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 @@ -936,7 +936,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 d12f23d1a9b6ee25ea058683f3f643f9a0b6b9b9..c7173809ebf11fb40fea3d62509f168b0492ed92 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -910,7 +910,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; }