diff --git a/dap-sdk b/dap-sdk index c9aae9ce01308a85586b770adf02badb6c9c6a39..880cc0469b0370b82552cc58e7ace83f7b711601 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit c9aae9ce01308a85586b770adf02badb6c9c6a39 +Subproject commit 880cc0469b0370b82552cc58e7ace83f7b711601 diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index e71fa132e6e658736f44b1f8d59efe8f7cd8bc9b..bbba6f9e52001623d10cd23e672ca07a7971aff5 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -315,7 +315,7 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d if (l_objs_count >= 10) { for (size_t i = 0; i < l_objs_count; i++) { SUM_256_256(l_value_total, *(uint256_t*)l_objs[i].value, &l_value_total); - if (compare256(l_value_total, l_esbocs_pvt->collecting_level) == 1) { + if (compare256(l_value_total, l_esbocs_pvt->collecting_level) >= 0) { l_level_reached = true; break; } @@ -336,12 +336,12 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d dap_chain_mempool_tx_reward_create(l_blocks, l_esbocs_pvt->blocks_sign_key, l_esbocs_pvt->collecting_addr, l_block_list, l_esbocs_pvt->minimum_fee, "hex"); if (l_tx_hash_str) { - dap_global_db_del_sync(a_group, NULL); log_it(L_NOTICE, "%s collect transaction successfully created, hash = %s", l_fee_collect ? "Fee" : "Reward", l_tx_hash_str); DAP_DELETE(l_tx_hash_str); } else log_it(L_ERROR, "%s collect transaction creation error", l_fee_collect ? "Fee" : "Reward"); + dap_global_db_del_sync(a_group, NULL); } dap_global_db_objs_delete(l_objs, l_objs_count); } diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index d9e41a58b645cea085257ade296d03fb159e50e3..3b786b824d87d281a68cbc2c757d33625083a286 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -384,7 +384,7 @@ char *dap_chain_mempool_tx_coll_fee_create(dap_chain_cs_blocks_t *a_blocks, dap_ uint256_t l_value_tax = {}; dap_chain_net_srv_stake_item_t *l_key_item = dap_chain_net_srv_stake_check_pkey_hash(&l_sign_pkey_hash); if (l_key_item && !IS_ZERO_256(l_key_item->sovereign_tax) && - dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) { + !dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) { MULT_256_COIN(l_value_out, l_key_item->sovereign_tax, &l_value_tax); if (compare256(l_value_tax, l_value_out) < 1) SUBTRACT_256_256(l_value_out, l_value_tax, &l_value_out); @@ -513,7 +513,7 @@ char *dap_chain_mempool_tx_reward_create(dap_chain_cs_blocks_t *a_blocks, dap_en uint256_t l_value_tax = {}; dap_chain_net_srv_stake_item_t *l_key_item = dap_chain_net_srv_stake_check_pkey_hash(&l_sign_pkey_hash); if (l_key_item && !IS_ZERO_256(l_key_item->sovereign_tax) && - dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) { + !dap_chain_addr_is_blank(&l_key_item->sovereign_addr)) { MULT_256_COIN(l_value_out, l_key_item->sovereign_tax, &l_value_tax); if (compare256(l_value_tax, l_value_out) < 1) SUBTRACT_256_256(l_value_out, l_value_tax, &l_value_out); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index e9d19af8a5a7c59ff1ee34905c19820d0ba60581..5b73b08c88aa8aa1745941a45f390b74083c3c9c 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -4093,7 +4093,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx } l_value = l_tx_out->header.value; l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out); - if (l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE && + if (l_tax_check && l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE && SUBTRACT_256_256(l_taxed_value, l_value, &l_taxed_value)) { log_it(L_WARNING, "Fee is greater than sum of inputs"); l_err_num = -89; diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index ebf145c201fddf4193b96a1903346ff706776cca..51576fa3b5eea15fcf62fad139cc248038da6f7f 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -517,7 +517,7 @@ static int s_cli_net_srv( int argc, char **argv, char **a_str_reply) dap_string_free(l_string_ret, true); return -21; } - if (l_node_addr_str){ + 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 ); } else { diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 72d73bd09f0cbdcc57a49985e5cc0db3f85504d9..aeae11058543e62e5f723679484d249cc6b714a5 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -425,7 +425,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_ne if (!l_gdb_order) continue; // check order size - size_t l_expected_size = dap_chain_net_srv_order_get_size(l_order); + size_t l_expected_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_gdb_order); if (l_order_size != l_expected_size) { log_it(L_ERROR, "Found wrong size order %zu, expected %zu", l_order_size, l_expected_size); DAP_DELETE(l_gdb_order); @@ -457,6 +457,9 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ { if (!a_net || !a_output_orders || !a_output_orders_count) return -1; + size_t l_orders_size = 0, l_output_orders_count = 0; + *a_output_orders = NULL; + for (int i = 0; i < 2; i++) { char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(a_net) : dap_chain_net_srv_order_get_common_group(a_net); @@ -464,9 +467,6 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); log_it( L_DEBUG, "Loaded %zu orders", l_orders_count); dap_chain_net_srv_order_t *l_order = NULL; - *a_output_orders = NULL; - size_t l_output_orders_count = 0; - size_t l_orders_size = 0; for (size_t i = 0; i < l_orders_count; i++) { DAP_DEL_Z(l_order); l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len); @@ -502,14 +502,14 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ size_t l_order_mem_size = dap_chain_net_srv_order_get_size(l_order); *a_output_orders = DAP_REALLOC(*a_output_orders, l_orders_size + l_order_mem_size); memcpy((byte_t *)*a_output_orders + l_orders_size, l_order, l_order_mem_size); + DAP_DEL_Z(l_order); l_orders_size += l_order_mem_size; l_output_orders_count++; } - *a_output_orders_count = l_output_orders_count; - DAP_DEL_Z(l_order); dap_global_db_objs_delete(l_orders, l_orders_count); DAP_DELETE(l_gdb_group_str); } + *a_output_orders_count = l_output_orders_count; return 0; } 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 7c86ae118feccae149f97ff563845427ecbc726e..8d981a4b0ff3fcfcd90b5586b873d9877f761a3d 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 @@ -69,9 +69,10 @@ int dap_chain_net_srv_stake_pos_delegate_init() "srv_stake order create [fee] -net <net_name> -value <value> -cert <priv_cert_name> [-H {hex(default) | base58}]\n" "\tCreates an order declaring the minimum fee that the validator agrees to for process a transaction.\n" "srv_stake order create validator -net <net_name> -value_min <minimum_stake_value> -value_max <maximum_stake_value>" - " -tax <percent> [-H {hex(default) | base58}]\n" + " -tax <percent> -cert <priv_cert_name> [-H {hex(default) | base58}]\n" "\tCreates an order declaring wanted tax and minimum/maximum stake value that the validator agrees to work.\n" - "srv_stake order create staker -net <net_name> -w <wallet_wtih_m_tokens> -value <stake_value> -tax <percent> [-addr <for_tax_collecting>] [-H {hex(default) | base58}]\n" + "srv_stake order create staker -net <net_name> -w <wallet_wtih_m_tokens> -value <stake_value> -tax <percent>" + " [-addr <for_tax_collecting>] [-cert <priv_cert_name>] [-H {hex(default) | base58}]\n" "\tCreates an order allowing the validator to delegate it's key with specified params\n" "srv_stake order update -net <net_name> -order <order_hash> [-params]\n" "\tUpdates an order with specified hash\n" @@ -1024,21 +1025,24 @@ char *s_fee_order_create(dap_chain_net_t *a_net, uint256_t *a_fee, dap_enc_key_t return l_order_hash_str; } -char *s_validator_order_create(dap_chain_net_t *a_net, uint256_t a_value_min, uint256_t a_value_max, uint256_t a_tax, const char *a_hash_out_type) +struct validator_odrer_ext { + uint256_t value_min; + uint256_t value_max; +} DAP_ALIGN_PACKED; + +char *s_validator_order_create(dap_chain_net_t *a_net, uint256_t a_value_min, uint256_t a_value_max, uint256_t a_tax, + dap_enc_key_t *a_key, const char *a_hash_out_type) { dap_chain_hash_fast_t l_tx_hash = {}; - dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_BUY; + dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL; const char *l_native_ticker = a_net->pub.native_ticker; dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_PCS}; dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS }; - struct odrer_ext { - uint256_t value_min; - uint256_t value_max; - } DAP_ALIGN_PACKED l_order_ext = { a_value_min, a_value_max }; + struct validator_odrer_ext l_order_ext = { a_value_min, a_value_max }; dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_compose(a_net, l_dir, l_uid, g_node_addr, l_tx_hash, &a_tax, l_unit, l_native_ticker, 0, (const uint8_t *)&l_order_ext, sizeof(l_order_ext), - 1, NULL, 0, NULL); + 1, NULL, 0, a_key); if (!l_order) return NULL; char *l_order_hash_str = dap_chain_net_srv_order_save(a_net, l_order, true); @@ -1052,9 +1056,9 @@ char *s_validator_order_create(dap_chain_net_t *a_net, uint256_t a_value_min, ui } char *s_staker_order_create(dap_chain_net_t *a_net, uint256_t a_value, uint256_t a_tax, dap_hash_fast_t *a_tx_hash, - dap_chain_addr_t *a_addr, const char *a_hash_out_type) + dap_chain_addr_t *a_addr, dap_enc_key_t *a_key, const char *a_hash_out_type) { - dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL; + dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_BUY; const char *l_native_ticker = a_net->pub.native_ticker; dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_PCS}; dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS }; @@ -1065,7 +1069,7 @@ char *s_staker_order_create(dap_chain_net_t *a_net, uint256_t a_value, uint256_t dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_compose(a_net, l_dir, l_uid, g_node_addr, *a_tx_hash, &a_tax, l_unit, l_native_ticker, 0, (const uint8_t *)&l_order_ext, sizeof(l_order_ext), - 1, NULL, 0, NULL); + 1, NULL, 0, a_key); if (!l_order) return NULL; char *l_order_hash_str = dap_chain_net_srv_order_save(a_net, l_order, true); @@ -1183,8 +1187,19 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or eqal than 100%% and higher or eqal than 1.0e-16%%"); return -10; } + const char *l_cert_str = NULL; + dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", &l_cert_str); + if (!l_cert_str) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Validator order creation requires parameter -cert"); + return -7; + } + dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); + if (!l_cert) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); + return -8; + } // Create the order & put it in GDB - char *l_order_hash_str = s_validator_order_create(l_net, l_value_min, l_value_max, l_tax, a_hash_out_type); + char *l_order_hash_str = s_validator_order_create(l_net, l_value_min, l_value_max, l_tax, l_cert->enc_key, a_hash_out_type); if (l_order_hash_str) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str); DAP_DELETE(l_order_hash_str); @@ -1268,7 +1283,18 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha // Create the order & put it in GDB dap_hash_fast_t l_tx_hash = {}; dap_chain_hash_fast_from_hex_str(l_tx_hash_str, &l_tx_hash); - char *l_order_hash_str = s_staker_order_create(l_net, l_value, l_tax, &l_tx_hash, &l_addr, a_hash_out_type); + char *l_cert_str = NULL, *l_default_cert_str = NULL; + dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-cert", (const char **)&l_cert_str); + if (!l_cert_str) + l_cert_str = l_default_cert_str = dap_strdup_printf("node-addr-%s", l_net->pub.name); + dap_cert_t *l_cert = dap_cert_find_by_name(l_cert_str); + if (!l_cert) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); + DAP_DEL_Z(l_default_cert_str); + return -8; + } + DAP_DEL_Z(l_default_cert_str); + char *l_order_hash_str = s_staker_order_create(l_net, l_value, l_tax, &l_tx_hash, &l_addr, l_cert->enc_key, a_hash_out_type); if (l_order_hash_str) { dap_cli_server_cmd_set_reply_text(a_str_reply, "%sSuccessfully created order %s", l_sign_str, l_order_hash_str); DAP_DELETE(l_order_hash_str); @@ -1353,32 +1379,36 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha dap_cli_server_cmd_set_reply_text(a_str_reply, "Network %s not found", l_net_str); return -4; } - char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net); - size_t l_orders_count = 0; - dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); dap_string_t *l_reply_str = dap_string_new(""); - for (size_t i = 0; i < l_orders_count; i++) { - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; - if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID) - continue; - // TODO add filters to list (token, address, etc.) - char *l_price_coins = dap_chain_balance_to_coins(l_order->price); - char *l_price_datoshi = dap_chain_balance_print(l_order->price); - char *l_node_addr = dap_strdup_printf(NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_order->node_addr)); - char l_created[80] = {'\0'}; - dap_time_t l_ts_created = l_order->ts_created; - dap_ctime_r(&l_ts_created, l_created); - dap_string_append_printf(l_reply_str, "Order: %s\n" - "\tCreated: %s" - "\tPrice: %s (%s) %s\n" - "\tNode addr: %s\n", - l_orders[i].key, l_created, l_price_coins, l_price_datoshi, l_order->price_ticker, l_node_addr); - DAP_DELETE(l_price_coins); - DAP_DELETE(l_price_datoshi); - DAP_DELETE(l_node_addr); + for (int i = 0; i < 2; i++) { + char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(l_net) : + dap_chain_net_srv_order_get_common_group(l_net); + size_t l_orders_count = 0; + dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); + for (size_t i = 0; i < l_orders_count; i++) { + dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; + if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID && + l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS) + continue; + // TODO add filters to list (token, address, etc.) + char *l_price_coins = dap_chain_balance_to_coins(l_order->price); + char *l_price_datoshi = dap_chain_balance_print(l_order->price); + char *l_node_addr = dap_strdup_printf(NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_order->node_addr)); + char l_created[80] = {'\0'}; + dap_time_t l_ts_created = l_order->ts_created; + dap_ctime_r(&l_ts_created, l_created); + dap_string_append_printf(l_reply_str, "Order: %s\n" + "\tCreated: %s" + "\tPrice: %s (%s) %s\n" + "\tNode addr: %s\n", + l_orders[i].key, l_created, l_price_coins, l_price_datoshi, l_order->price_ticker, l_node_addr); + DAP_DELETE(l_price_coins); + DAP_DELETE(l_price_datoshi); + DAP_DELETE(l_node_addr); + } + dap_global_db_objs_delete(l_orders, l_orders_count); + DAP_DELETE( l_gdb_group_str); } - dap_global_db_objs_delete(l_orders, l_orders_count); - DAP_DELETE( l_gdb_group_str); if (!l_reply_str->len) { dap_string_append(l_reply_str, "No orders found"); } @@ -1418,14 +1448,16 @@ static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, uint256_t snprintf(l_active_str, 32, "\tActive: %s\n", a_stake->is_active ? "true" : "false"); char *l_sov_addr_str = dap_chain_addr_is_blank(&a_stake->sovereign_addr) ? dap_strdup("N/A") : dap_chain_addr_to_str(&a_stake->sovereign_addr); - char *l_sov_tax_str = dap_chain_balance_to_coins(a_stake->sovereign_tax); + uint256_t l_sov_tax_percent = uint256_0; + MULT_256_256(a_stake->sovereign_tax, GET_256_FROM_64(100), &l_sov_tax_percent); + char *l_sov_tax_str = dap_chain_balance_to_coins(l_sov_tax_percent); dap_string_append_printf(a_string, "Pkey hash: %s\n" "\tStake value: %s\n" "\tRelated weight: %s%%\n" "\tTx hash: %s\n" "\tNode addr: "NODE_ADDR_FP_STR"\n" "\tSovereign addr: %s\n" - "\tSovereign tax: %s\n" + "\tSovereign tax: %s%%\n" "%s\n", l_pkey_hash_str, l_balance, l_rel_weight_str, l_tx_hash_str, NODE_ADDR_FP_ARGS_S(a_stake->node_addr), @@ -1603,9 +1635,9 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply) const char * l_hash_out_type = NULL; dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, dap_min(a_argc, l_arg_index + 1), "-H", &l_hash_out_type); - if(!l_hash_out_type) - l_hash_out_type = "base58"; - if(dap_strcmp(l_hash_out_type," hex") && dap_strcmp(l_hash_out_type, "base58")) { + if (!l_hash_out_type) + l_hash_out_type = "hex"; + else if (dap_strcmp(l_hash_out_type," hex") && dap_strcmp(l_hash_out_type, "base58")) { dap_cli_server_cmd_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); return -1; } @@ -1762,6 +1794,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply) return -13; } dap_chain_node_addr_t l_node_addr; + uint256_t l_value_min, l_value_max; if (l_cert_str) { dap_cert_t *l_signing_cert = dap_cert_find_by_name(l_cert_str); if (!l_signing_cert) { @@ -1801,22 +1834,29 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply) dap_chain_wallet_close(l_wallet); return -25; } - dap_pkey_t *l_pkey = (dap_pkey_t *)l_order->ext_n_sign; - if (l_order->ext_size < sizeof(dap_pkey_t) || l_order->ext_size != dap_pkey_get_size(l_pkey)) { + if (l_order->ext_size != sizeof(struct validator_odrer_ext)) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order has invalid size"); dap_chain_wallet_close(l_wallet); DAP_DELETE(l_order); return -26; } + struct validator_odrer_ext *l_ext = (struct validator_odrer_ext *)l_order->ext_n_sign; + l_value_min = l_ext->value_min; + l_value_max = l_ext->value_max; + dap_sign_t *l_sign = (dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size); + if (l_sign->header.type.type == SIG_TYPE_NULL) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is unsigned"); + dap_chain_wallet_close(l_wallet); + DAP_DELETE(l_order); + return -27; + } if (dap_strcmp(l_order->price_ticker, l_net->pub.native_ticker)) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified order is invalid"); dap_chain_wallet_close(l_wallet); DAP_DELETE(l_order); - return -27; + return -28; } - dap_hash_t l_pkey_hash; - dap_pkey_get_hash(l_pkey, &l_pkey_hash); - dap_chain_addr_fill(&l_signing_addr, dap_pkey_type_to_sign_type(l_pkey->header.type), &l_pkey_hash, l_net->pub.id); + dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_net->pub.id); l_node_addr = l_order->node_addr; l_sovereign_tax = l_order->price; DAP_DELETE(l_order); @@ -1824,7 +1864,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply) compare256(l_sovereign_tax, GET_256_FROM_64(100)) == -1) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Tax must be lower or eqal than 100%% and higher or eqal than 1.0e-16%%"); dap_chain_wallet_close(l_wallet); - return -28; + return -29; } DIV_256(l_sovereign_tax, GET_256_FROM_64(100), &l_sovereign_tax); } @@ -1857,7 +1897,30 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply) dap_chain_wallet_close(l_wallet); return -11; } - + if (l_order_hash_str && compare256(l_value, l_value_min) == -1) { + char *l_coin_str = dap_chain_balance_to_coins(l_value); + char *l_value_min_str = dap_chain_balance_print(l_value_min); + char *l_coin_min_str = dap_chain_balance_to_coins(l_value_min); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s(%s) is lower than order minimum allowed value %s(%s)", + l_coin_str, l_value_str, l_coin_min_str, l_value_min_str); + DAP_DELETE(l_coin_str); + DAP_DELETE(l_value_min_str); + DAP_DELETE(l_coin_min_str); + dap_chain_wallet_close(l_wallet); + return -13; + } + if (l_order_hash_str && compare256(l_value, l_value_max) == 1) { + char *l_coin_str = dap_chain_balance_to_coins(l_value); + char *l_value_max_str = dap_chain_balance_print(l_value_max); + char *l_coin_max_str = dap_chain_balance_to_coins(l_value_max); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Number in '-value' param %s(%s) is higher than order minimum allowed value %s(%s)", + l_coin_str, l_value_str, l_coin_max_str, l_value_max_str); + DAP_DELETE(l_coin_str); + DAP_DELETE(l_value_max_str); + DAP_DELETE(l_coin_max_str); + dap_chain_wallet_close(l_wallet); + return -14; + } dap_cli_server_cmd_find_option_val(a_argv, l_arg_index, a_argc, "-fee", &l_fee_str); if (!l_fee_str) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Command 'delegate' requires parameter -fee");