From 3fc8c8e364f8dcfec20091b8d6cbde38c173a755 Mon Sep 17 00:00:00 2001 From: "davlet.sibgatullin" <davlet.sibgatullin@demlabs.net> Date: Wed, 1 Jun 2022 16:37:18 +0000 Subject: [PATCH] [+] started adding support for fixed-point math in exchanger and stake... Former-commit-id: ed0b3630d227a1cf5da6f4b5f6e2514fee338080 --- .../service/stake/dap_chain_net_srv_stake.c | 7 +++- .../xchange/dap_chain_net_srv_xchange.c | 41 +++++++++++++------ .../include/dap_chain_net_srv_xchange.h | 4 +- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index 72767f217f..6538a04c0a 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -346,7 +346,12 @@ bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum } } dap_list_free(l_list_out_items); - uint256_t l_fee = {}; // TODO replace with fractional mult MULT_256_FRAC_FRAC(l_outs_sum, l_stake->fee_value / 100.0); + uint256_t l_fee = uint256_0; // TODO replace with fractional mult MULT_256_FRAC_FRAC(l_outs_sum, l_stake->fee_value / 100.0); +++ + DIV_256(l_stake->fee_value, dap_chain_coins_to_balance("100.0"), &l_fee); + if (MULT_256_COIN(l_outs_sum, l_fee, &l_fee)) { + log_it(L_WARNING, "DANGER: MULT_256_COIN overflow! in dap_chain_net_srv_stake_validator()"); + l_fee = uint256_0; + } if (compare256(l_fee_sum, l_fee) == -1) { return false; } diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 529b51064e..f04ea9ce2f 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -142,7 +142,12 @@ static dap_chain_datum_tx_receipt_t *s_xchage_receipt_create(dap_chain_net_srv_x { uint32_t l_ext_size = sizeof(uint256_t) + DAP_CHAIN_TICKER_SIZE_MAX; uint8_t *l_ext = DAP_NEW_S_SIZE(uint8_t, l_ext_size); - uint256_t l_datoshi_buy = {}; // TODO rework it with fixed point MULT_256_FRAC_FRAC(a_price->datoshi_sell, 1 / a_price->rate); + uint256_t l_datoshi_buy = uint256_0; // TODO rework it with fixed point MULT_256_FRAC_FRAC(a_price->datoshi_sell, 1 / a_price->rate); +++ + DIV_256(dap_chain_coins_to_balance("1.0"), a_price->rate, &l_datoshi_buy); + if (MULT_256_COIN(a_price->datoshi_sell, l_datoshi_buy, &l_datoshi_buy)) { + log_it(L_WARNING, "DANGER: MULT_256_COIN overflow! in s_xchage_receipt_create()"); + l_datoshi_buy = uint256_0; + } memcpy(l_ext, &l_datoshi_buy, sizeof(uint256_t)); strcpy((char *)&l_ext[sizeof(uint256_t)], a_price->token_buy); dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED}; @@ -237,7 +242,12 @@ static dap_chain_datum_tx_t *s_xchange_tx_create_exchange(dap_chain_net_srv_xcha dap_enc_key_t *l_seller_key = dap_chain_wallet_get_key(a_wallet, 0); uint256_t l_value_buy = {}; // how many coins to transfer // list of transaction with 'out' items to sell - uint256_t l_datoshi_buy = {}; // TODO rework it with fixed point MULT_256_FRAC_FRAC(a_price->datoshi_sell, 1 / a_price->rate); + uint256_t l_datoshi_buy = uint256_0; // TODO rework it with fixed point MULT_256_FRAC_FRAC(a_price->datoshi_sell, 1 / a_price->rate); +++ + DIV_256(dap_chain_coins_to_balance("1.0"), a_price->rate, &l_datoshi_buy); + if (MULT_256_COIN(a_price->datoshi_sell, l_datoshi_buy, &l_datoshi_buy)) { + log_it(L_WARNING, "DANGER: MULT_256_COIN overflow! in s_xchange_tx_create_exchange()"); + l_datoshi_buy = uint256_0; + } dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_price->token_buy, l_seller_addr, l_datoshi_buy, &l_value_buy); if(!l_list_used_out) { @@ -414,7 +424,12 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(a_price->net_sell); dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED}; dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID }; - uint256_t l_datoshi_buy = {}; // TODO rework it with fixed point MULT_256_FRAC_FRAC(a_price->datoshi_sell, 1 / a_price->rate); + uint256_t l_datoshi_buy = uint256_0; // TODO rework it with fixed point MULT_256_FRAC_FRAC(a_price->datoshi_sell, 1 / a_price->rate); +++ + DIV_256(dap_chain_coins_to_balance("1.0"), a_price->rate, &l_datoshi_buy); + if (MULT_256_COIN(a_price->datoshi_sell, l_datoshi_buy, &l_datoshi_buy)) { + log_it(L_WARNING, "DANGER: MULT_256_COIN overflow! in s_xchange_order_create()"); + l_datoshi_buy = uint256_0; + } char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net_buy, SERV_DIR_SELL, l_uid, *l_node_addr, l_tx_hash, l_datoshi_buy, l_unit, a_price->token_buy, 0, (uint8_t *)&l_ext, l_ext_size, NULL, 0, a_price->wallet_key); @@ -431,7 +446,7 @@ dap_chain_net_srv_xchange_price_t *s_xchange_price_from_order(dap_chain_net_t *a strcpy(l_price->token_sell, l_ext->token_sell); l_price->net_buy = a_net; strcpy(l_price->token_buy, a_order->price_ticker); - l_price->rate = 1; // TODO (long double)l_price->datoshi_sell / a_order->price; + DIV_256(l_price->datoshi_sell, a_order->price, &l_price->rate);//l_price->rate = dap_chain_coins_to_balance("1.0");//1; // TODO (long double)l_price->datoshi_sell / a_order->price; return l_price; } @@ -573,8 +588,8 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'price create' required parameter -rate"); return -8; } - long double l_rate = strtold(l_val_rate_str, NULL); - if (!l_rate) { + uint256_t l_rate = dap_chain_coins_to_balance(l_val_rate_str); + if (!compare256(l_rate, uint256_0)) { // if (l_rate == 0) dap_chain_node_cli_set_reply_text(a_str_reply, "Format -rate <long double> = sell / buy"); return -9; } @@ -684,7 +699,7 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c } else { // CMD_UPDATE const char *l_val_sell_str = NULL, *l_val_rate_str = NULL, *l_wallet_str = NULL, *l_new_wallet_str = NULL; uint256_t l_datoshi_sell = {}; - long double l_rate = 0; + uint256_t l_rate = uint256_0; dap_chain_wallet_t *l_wallet = NULL; dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-coins", &l_val_sell_str); if (l_val_sell_str) { @@ -696,8 +711,8 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c } dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-rate", &l_val_rate_str); if (l_val_rate_str) { - l_rate = strtold(l_val_rate_str, NULL); - if (!l_rate) { + l_rate = dap_chain_coins_to_balance(l_val_rate_str); + if (!compare256(l_rate, uint256_0)) { // if (l_rate == 0) dap_chain_node_cli_set_reply_text(a_str_reply, "Format -rate <long double> = sell / buy"); return -9; } @@ -784,9 +799,9 @@ static int s_cli_srv_xchange_price(int a_argc, char **a_argv, int a_arg_index, c dap_string_t *l_reply_str = dap_string_new(""); HASH_ITER(hh, s_srv_xchange->pricelist, l_price, l_tmp) { char *l_order_hash_str = dap_chain_hash_fast_to_str_new(&l_price->order_hash); - dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %Lf %s\n", l_order_hash_str, l_price->token_sell, + dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %s %s\n", l_order_hash_str, l_price->token_sell, l_price->net_sell->pub.name, l_price->token_buy, l_price->net_buy->pub.name, - dap_chain_balance_print(l_price->datoshi_sell), l_price->rate, l_price->wallet_str); + dap_chain_balance_print(l_price->datoshi_sell), dap_chain_balance_print(l_price->rate), l_price->wallet_str); DAP_DELETE(l_order_hash_str); } if (!l_reply_str->len) { @@ -851,9 +866,9 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply) continue; // TODO add filters to list (tokens, network, etc.) l_price = s_xchange_price_from_order(l_net, l_order); - dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %Lf\n", l_orders[i].key, l_price->token_sell, + dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %s\n", l_orders[i].key, l_price->token_sell, l_price->net_sell->pub.name, l_price->token_buy, l_price->net_buy->pub.name, - dap_chain_balance_print(l_price->datoshi_sell), l_price->rate); + dap_chain_balance_print(l_price->datoshi_sell), dap_chain_balance_print(l_price->rate)); DAP_DELETE(l_price); } dap_chain_global_db_objs_delete(l_orders, l_orders_count); diff --git a/modules/service/xchange/include/dap_chain_net_srv_xchange.h b/modules/service/xchange/include/dap_chain_net_srv_xchange.h index 6776a7e0ba..216f1ca0ed 100644 --- a/modules/service/xchange/include/dap_chain_net_srv_xchange.h +++ b/modules/service/xchange/include/dap_chain_net_srv_xchange.h @@ -37,7 +37,7 @@ typedef struct dap_chain_net_srv_xchange_price { uint256_t datoshi_sell; dap_chain_net_t *net_buy; char token_buy[DAP_CHAIN_TICKER_SIZE_MAX]; - long double rate; + uint256_t rate; dap_chain_hash_fast_t tx_hash; dap_chain_hash_fast_t order_hash; dap_enc_key_t *wallet_key; @@ -53,7 +53,7 @@ typedef struct dap_chain_net_srv_xchange_db_item { uint64_t net_sell_id; uint64_t net_buy_id; uint256_t datoshi_sell; - long double rate; + uint256_t rate; dap_chain_hash_fast_t tx_hash; dap_chain_hash_fast_t order_hash; char wallet_str[]; -- GitLab