diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 2ef28135c8e3f4e74ecfb96f3001c8fb31206090..52885f1f6348ccf3a77f163488407977d30c9186 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -381,27 +381,27 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t * switch(a_token->type){ case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: l_token_item->datum_token->header_simple.current_supply_256 = a_token->header_simple.total_supply_256; - l_token_item->total_supply = a_token->header_simple.total_supply_256; + l_token_item->total_supply = a_token->header_simple.total_supply_256; l_token_item->current_supply = a_token->header_simple.total_supply_256; l_token_item->auth_signs_total = a_token->header_simple.signs_total; l_token_item->auth_signs_valid = a_token->header_simple.signs_valid; - l_token_cache->header_simple.current_supply_256 = l_token_item->total_supply; + l_token_cache->header_simple.current_supply_256 = l_token_item->total_supply; break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: l_token_item->datum_token->header_private_decl.current_supply_256 = a_token->header_private_decl.total_supply_256; - l_token_item->total_supply = a_token->header_private_decl.total_supply_256; + l_token_item->total_supply = a_token->header_private_decl.total_supply_256; l_token_item->current_supply = a_token->header_private_decl.total_supply_256; l_token_item->auth_signs_total = a_token->header_private_decl.signs_total; l_token_item->auth_signs_valid = a_token->header_private_decl.signs_valid; - l_token_cache->header_private_decl.current_supply_256 = l_token_item->total_supply; + l_token_cache->header_private_decl.current_supply_256 = l_token_item->total_supply; break; case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL: l_token_item->datum_token->header_native_decl.current_supply_256 = a_token->header_native_decl.total_supply_256; - l_token_item->total_supply = a_token->header_native_decl.total_supply_256; + l_token_item->total_supply = a_token->header_native_decl.total_supply_256; l_token_item->current_supply = a_token->header_native_decl.total_supply_256; l_token_item->auth_signs_total = a_token->header_native_decl.signs_total; l_token_item->auth_signs_valid = a_token->header_native_decl.signs_valid; - l_token_cache->header_native_decl.current_supply_256 = l_token_item->total_supply; + l_token_cache->header_native_decl.current_supply_256 = l_token_item->total_supply; default: break; } @@ -450,7 +450,7 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t * } break; } - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 l_token_item->auth_signs= dap_chain_datum_token_simple_signs_parse(a_token,a_token_size, &l_token_item->auth_signs_total, &l_token_item->auth_signs_valid ); @@ -466,7 +466,7 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t * } s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size); break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL: // 256 l_token_item->auth_signs= dap_chain_datum_token_simple_signs_parse(a_token,a_token_size, &l_token_item->auth_signs_total, &l_token_item->auth_signs_valid ); @@ -617,7 +617,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite if(s_debug_more) log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD has address %s thats already present in list", l_addr_str); - DAP_DELETE(l_addr_str); + DAP_DELETE(l_addr_str); DAP_DELETE(a_token_item->tx_recv_allow); a_token_item->tx_recv_allow = NULL; return -11; @@ -983,9 +983,9 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 l_type_str = "PRIVATE_UPDATE"; break; case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL: // 256 - l_type_str = "CF20"; break; + l_type_str = "NATIVE"; break; case DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_UPDATE: // 256 - l_type_str = "CF20_UPDATE"; break; + l_type_str = "NATIVE_UPDATE"; break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: // 256 case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: l_type_str = "PUBLIC"; @@ -994,16 +994,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) } char *l_item_str = NULL; - if ((l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL) || (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_UPDATE)){ - l_item_str = dap_strdup_printf("Token name '%s', type %s, flags: %s\n" - "\tDecimals: 18\n" - "\tAuth signs (valid/total) %zu/%zu\n" - "\tTotal emissions %u\n", - &l_token_item->ticker, l_type_str, s_flag_str_from_code(l_token_item->datum_token->header_private_decl.flags), - l_token_item->auth_signs_valid, l_token_item->auth_signs_total, - HASH_COUNT(l_token_item->token_emissions)); - } else { - l_item_str = dap_strdup_printf("Token name '%s', type %s, flags: %s\n" + l_item_str = dap_strdup_printf("Token name '%s', type %s, flags: %s\n" "\tSupply (current/total) %s/%s\n" "\tAuth signs (valid/total) %zu/%zu\n" "\tTotal emissions %u\n", @@ -1011,7 +1002,6 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) dap_chain_balance_print(l_token_item->current_supply), dap_chain_balance_print(l_token_item->total_supply), l_token_item->auth_signs_valid, l_token_item->auth_signs_total, HASH_COUNT(l_token_item->token_emissions)); - } l_ret_list = dap_list_append(l_ret_list, l_item_str); } @@ -1021,19 +1011,17 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) /** * @brief update current_supply in token cache - * + * * @param a_ledger ledger object * @param l_token_item token item object * @param l_emission_value size of emission - * @return true - * @return false + * @return true + * @return false */ bool s_update_token_cache(dap_ledger_t *a_ledger, dap_chain_ledger_token_item_t * l_token_item, uint256_t l_emission_value) { //Update value in ledger memory object - if (IS_ZERO_256(l_token_item->total_supply)) - return true; // Supply is unlimited if (s_token_supply_limit_disable){ log_it(L_WARNING,"s_token_supply_limit_disable is enabled in config, please fix it and disable"); return false; @@ -1049,23 +1037,23 @@ bool s_update_token_cache(dap_ledger_t *a_ledger, dap_chain_ledger_token_item_t dap_chain_balance_print(l_emission_value)); return false; } + //if load mode, we don't save anything + if (PVT(a_ledger)->load_mode) + return true; + // if cache mode disable we can't read something from GDB + if (!dap_config_get_item_bool_default(g_config, "ledger", "cached", true)) + return true; + // load ledger cache from GDB // Get dap_chain_datum_token_t token object from GDB, key is token name char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TOKENS_STR); size_t l_obj_length = 0; dap_chain_datum_token_t *l_token_cache = (dap_chain_datum_token_t *) dap_chain_global_db_gr_get(l_token_item->ticker, &l_obj_length, l_gdb_group); - if (!l_token_cache) { - if(s_debug_more) - log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_gdb_group); - return false; - } l_token_cache->header_simple.current_supply_256 = l_token_item->current_supply; if (!dap_chain_global_db_gr_set(l_token_item->ticker, l_token_cache, l_obj_length, l_gdb_group)) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_token_cache); DAP_DELETE(l_gdb_group); return false; } @@ -1162,13 +1150,13 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) l_token_item->current_supply = GET_256_FROM_64(l_token_item->datum_token->header_simple.current_supply); l_token_item->auth_signs_total = l_token_item->datum_token->header_simple.signs_total; l_token_item->auth_signs_valid = l_token_item->datum_token->header_simple.signs_valid; - } else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE) + } else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE) { l_token_item->total_supply = l_token_item->datum_token->header_simple.total_supply_256; l_token_item->current_supply = l_token_item->datum_token->header_simple.current_supply_256; l_token_item->auth_signs_total = l_token_item->datum_token->header_simple.signs_total; l_token_item->auth_signs_valid = l_token_item->datum_token->header_simple.signs_valid; - if (l_token_item->auth_signs_total) + if (l_token_item->auth_signs_total) { l_token_item->auth_signs_pkey_hash = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, sizeof(dap_chain_hash_fast_t) * l_token_item->auth_signs_total); @@ -1179,7 +1167,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) dap_sign_get_pkey_hash(l_token_item->auth_signs[k], &l_token_item->auth_signs_pkey_hash[k]); } } - } else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL) + } else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL) { l_token_item->total_supply = l_token_item->datum_token->header_private_decl.total_supply_256; l_token_item->current_supply = l_token_item->datum_token->header_private_decl.current_supply_256; @@ -1196,7 +1184,7 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) dap_sign_get_pkey_hash(l_token_item->auth_signs[k], &l_token_item->auth_signs_pkey_hash[k]); } } - } else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL) + } else if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL) { l_token_item->total_supply = l_token_item->datum_token->header_native_decl.total_supply_256; l_token_item->current_supply = l_token_item->datum_token->header_native_decl.current_supply_256; @@ -1322,12 +1310,12 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags, char *a_net_name) } /** - * @brief - * - * @param l_add_addr01 - * @param l_add_addr02 - * @return true - * @return false + * @brief + * + * @param l_add_addr01 + * @param l_add_addr02 + * @return true + * @return false */ bool s_chain_compare_token_addresses(dap_chain_addr_t * l_add_addr01, dap_chain_addr_t * l_add_addr02) { @@ -1337,7 +1325,7 @@ bool s_chain_compare_token_addresses(dap_chain_addr_t * l_add_addr01, dap_chain_ //0 if equal if (!memcmp(l_add_addr01,l_add_addr02,sizeof(dap_chain_addr_t))) return true; - + return false; } @@ -1352,7 +1340,7 @@ bool s_chain_ledger_token_tsd_check(dap_chain_ledger_token_item_t * l_token_item dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(l_token_item->datum_token, l_token_item->datum_token_size); if (!l_tsd) return false; - + dap_chain_addr_t *l_add_addr = NULL; size_t l_tsd_size=0; size_t l_tsd_total_size = l_token_item->datum_token->header_private_decl.tsd_total_size; @@ -1381,7 +1369,7 @@ bool s_chain_ledger_token_tsd_check(dap_chain_ledger_token_item_t * l_token_item default: break; } - } + } log_it(L_WARNING, "Address %s is not allowed for emission for token %s", dap_chain_addr_to_str(&a_token_emission->hdr.address), l_token_item->ticker); return false; } @@ -1439,19 +1427,11 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ return -5; } - // if total_supply > 0 we can check current_supply - if (!IS_ZERO_256(l_token_item->total_supply)){ - if (compare256(l_token_item->current_supply, l_emission->hdr.value_256) < 0){ - log_it(L_WARNING,"Ledger_token_emission_add_check. current_supply %s is lower, then l_emission->hdr.value_256: %s", - dap_chain_balance_print(l_token_item->current_supply), - dap_chain_balance_print(l_emission->hdr.value_256)); + if (compare256(l_token_item->current_supply, l_emission->hdr.value_256) < 0) return -4; - } - } - //additional check for private tokens if ((l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL) || - (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE) || + (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE) || (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL) || (l_token_item->type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_UPDATE)) { if (!s_chain_ledger_token_tsd_check(l_token_item, l_emission)) @@ -1523,7 +1503,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_ pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock); HASH_FIND_STR(l_ledger_priv->tokens, c_token_ticker, l_token_item); pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock); - dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; + dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; if (!l_token_item && a_from_threshold) return DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN; @@ -1621,7 +1601,7 @@ int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token if (PVT(a_ledger)->load_mode) { dap_chain_ledger_token_emission_item_t *l_token_emission_item; dap_chain_ledger_token_item_t *l_token_item, *l_item_tmp; - pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); + pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_item_tmp) { pthread_rwlock_rdlock(&l_token_item->token_emissions_rwlock); HASH_FIND(hh, l_token_item->token_emissions, &l_token_emission_hash, sizeof(l_token_emission_hash), @@ -3609,3 +3589,8 @@ dap_list_t * dap_chain_ledger_get_txs(dap_ledger_t *a_ledger, size_t a_count, si } return l_list; } + +bool dap_chain_ledger_fee_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner) +{ + return false; +} diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index 57a22ad4f53f6ee07b208a6b39d0d57ac664ac6f..c7d0900f1409fcb0958b6d462e08f5873436b66d 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -226,3 +226,5 @@ int dap_chain_ledger_verificator_add(dap_chain_tx_out_cond_subtype_t a_subtype, // Getting a list of transactions from the ledger. dap_list_t * dap_chain_ledger_get_txs(dap_ledger_t *a_ledger, size_t a_count, size_t a_page); + +bool dap_chain_ledger_fee_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner); 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 f0d0b88f012802f7ec27b7c94ce61abb546759fc..9a10082f6b6dad587176d01fbee865624118b730 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 @@ -195,9 +195,9 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace) } // Check cond output if it equesl or not to request - if ( l_tx_out_cond->subtype.srv_pay.srv_uid.uint64 != l_request->hdr.srv_uid.uint64 ){ + if (!dap_chain_net_srv_uid_compare(l_tx_out_cond->header.srv_uid, l_request->hdr.srv_uid)) { log_it( L_WARNING, "Wrong service uid in request, tx expect to close its output with 0x%016"DAP_UINT64_FORMAT_X, - l_tx_out_cond->subtype.srv_pay.srv_uid.uint64 ); + l_tx_out_cond->header.srv_uid.uint64 ); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SRV_UID ; goto free_exit; } @@ -266,7 +266,7 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace) } else { l_price = DAP_NEW_Z(dap_chain_net_srv_price_t); memcpy(l_price, l_srv->pricelist, sizeof(*l_price)); - l_price->value_datoshi = 0; + l_price->value_datoshi = uint256_0; } l_usage->price = l_price; l_usage->receipt = dap_chain_net_srv_issue_receipt(l_usage->service, l_usage->price, NULL, 0); diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 377b98defc9dd083e5afaed2538ca90409a34a59..49edea6e914538a110da71ae6bbf8a4fbd6a755a 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -332,12 +332,22 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_tsd(dap_chain_dat dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_t *a_sign_key, dap_chain_datum_token_emission_t *a_emission) { - if (!a_emission) + if (!a_emission || a_emission->hdr.type != DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH) return NULL; - size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission); - dap_sign_t *l_sign = dap_sign_create(a_sign_key, a_emission, sizeof(a_emission->hdr), 0); + size_t l_pub_key_size = 0; + dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); + uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_sign_key, &l_pub_key_size); + for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) { + if (l_sign->header.sign_pkey_size == l_pub_key_size && + !memcmp(l_sign->pkey_n_sign, l_pub_key, l_pub_key_size)) + return a_emission; // this sign already exists + l_sign = (dap_sign_t *)((byte_t *)l_sign + dap_sign_get_size(l_sign)); + } + DAP_DELETE(l_pub_key); + l_sign = dap_sign_create(a_sign_key, a_emission, sizeof(a_emission->hdr), 0); if (!l_sign) return NULL; + size_t l_emission_size = dap_chain_datum_emission_get_size((uint8_t *)a_emission); dap_chain_datum_token_emission_t *l_ret = DAP_REALLOC(a_emission, l_emission_size + dap_sign_get_size(l_sign)); size_t l_sign_size = dap_sign_get_size(l_sign); memcpy(l_ret->tsd_n_signs + l_ret->data.type_auth.size, l_sign, l_sign_size); diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 37889fdc067611e805783d5f2864554bc0d0d70e..3e0ba4267257dff335ff2aa08f255edb91a5597b 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -142,6 +142,17 @@ int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_h } +int dap_chain_datum_tx_add_fee_item(dap_chain_datum_tx_t **a_tx, uint256_t a_value) +{ + dap_chain_tx_out_cond_t *l_tx_out_fee = dap_chain_datum_tx_item_out_cond_create_fee(a_value); + if (l_tx_out_fee) { + dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out_fee); + DAP_DELETE(l_tx_out_fee); + return 1; + } + return -1; +} + /** * Create 'out' item and insert to transaction * diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index dbb8480aa850770264e4ad863dcf5d3d566ebf99..c6d3b256d0bdb3205461ce220e8bfa113343d8b7 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -226,6 +226,8 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a { if(!a_addr) return NULL; + if (IS_ZERO_256(a_value)) + return NULL; dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t); l_item->header.type = TX_ITEM_TYPE_OUT; l_item->header.value = a_value; @@ -237,6 +239,8 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a { if (!a_addr || !a_token) return NULL; + if (IS_ZERO_256(a_value)) + return NULL; dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_tx_out_ext_t); l_item->header.type = TX_ITEM_TYPE_OUT_EXT; l_item->header.value = a_value; @@ -245,6 +249,17 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a return l_item; } +dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a_value) +{ + if (IS_ZERO_256(a_value)) + return NULL; + dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t); + l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; + l_item->header.value = a_value; + l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE; + return l_item; +} + /** * Create item dap_chain_tx_out_cond_t * @@ -257,15 +272,16 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke { if (!a_key || !a_key->pkey) return NULL; - + if (IS_ZERO_256(a_value)) + return NULL; dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size); - if(l_item == NULL) + if (l_item == NULL) return NULL; l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; l_item->header.value = a_value; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; - l_item->subtype.srv_pay.srv_uid = a_srv_uid; + l_item->header.srv_uid = a_srv_uid; l_item->subtype.srv_pay.unit = a_unit; l_item->subtype.srv_pay.unit_price_max_datoshi = a_value_max_per_unit; dap_hash_fast(a_key->pkey, a_key->header.size, &l_item->subtype.srv_pay.pkey_hash); @@ -280,14 +296,15 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap const char *a_token, uint256_t a_value, const void *a_params, uint32_t a_params_size) { - if (!a_token) { + if (!a_token) + return NULL; + if (IS_ZERO_256(a_value)) return NULL; - } dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size); l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; l_item->header.value = a_value; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE; - l_item->subtype.srv_xchange.srv_uid = a_srv_uid; + l_item->header.srv_uid = a_srv_uid; l_item->subtype.srv_xchange.net_id = a_net_id; strcpy(l_item->subtype.srv_xchange.token, a_token); l_item->params_size = a_params_size; @@ -297,15 +314,17 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap return l_item; } -dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value, +dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, uint256_t a_fee_value, dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, dap_chain_addr_t *a_signing_addr, dap_chain_node_addr_t *a_signer_node_addr) { + if (IS_ZERO_256(a_value)) + return NULL; dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t); l_item->header.item_type = TX_ITEM_TYPE_OUT_COND; l_item->header.value = a_value; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE; - l_item->subtype.srv_stake.srv_uid = a_srv_uid; + l_item->header.srv_uid = a_srv_uid; l_item->subtype.srv_stake.fee_value = a_fee_value; memcpy(&l_item->subtype.srv_stake.fee_addr, a_fee_addr, sizeof(dap_chain_addr_t)); memcpy(&l_item->subtype.srv_stake.hldr_addr, a_hldr_addr, sizeof(dap_chain_addr_t)); diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index df1f4a7f6c2bb9506edfed018a47dced84931f13..225ed8e7624cdbfa9388f967b11b21ae492a659f 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -78,8 +78,6 @@ typedef struct dap_chain_datum_token{ }; uint16_t signs_valid; // Emission auth signs uint16_t signs_total; // Emission auth signs - uint16_t padding01; - size_t padding02; uint16_t signs_current; } DAP_ALIGN_PACKED header_simple; // Private token declarations, with flags, manipulations and updates @@ -95,7 +93,7 @@ typedef struct dap_chain_datum_token{ uint16_t signs_valid; // Emission auth signs uint16_t signs_total; // Emission auth signs uint16_t flags; // Token declaration flags - size_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section + uint64_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section uint16_t signs_current; } DAP_ALIGN_PACKED header_private_decl; //native tokens @@ -111,18 +109,19 @@ typedef struct dap_chain_datum_token{ uint16_t signs_valid; // Emission auth signs uint16_t signs_total; // Emission auth signs uint16_t flags; // Token declaration flags - size_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section + uint64_t tsd_total_size; // Data size section with values in key-length-value list trailing the signs section uint16_t signs_current; + uint16_t decimals; } DAP_ALIGN_PACKED header_native_decl; // Private token update struct { uint16_t padding; - size_t tsd_total_size; // Data size section with extended values in key-length-value list. + uint64_t tsd_total_size; // Data size section with extended values in key-length-value list. } DAP_ALIGN_PACKED header_private_update; // native token update struct { uint16_t padding; - size_t tsd_total_size; // Data size section with extended values in key-length-value list. + uint64_t tsd_total_size; // Data size section with extended values in key-length-value list. } DAP_ALIGN_PACKED header_native_update; // Public token declaration struct { diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h index f07af98f8a19f8c74b72b484a80d6244df116018..f16eabcd54fa08371d1c14ae56b28b70d65ae100 100644 --- a/modules/common/include/dap_chain_datum_tx.h +++ b/modules/common/include/dap_chain_datum_tx.h @@ -106,6 +106,13 @@ int dap_chain_datum_tx_add_in_cond_item(dap_chain_datum_tx_t **a_tx, dap_chain_h */ int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value); +/** + * Create 'out_cond' item with fee value and insert to transaction + * + * return 1 Ok, -1 Error + */ +int dap_chain_datum_tx_add_fee_item(dap_chain_datum_tx_t **a_tx, uint256_t a_value); + /** * Create 'out'_ext item and insert to transaction * diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index 77ce4f9b05bc97baaed8bcdfcb233101fb898db1..7712406aec2afe5f028f1b56200dafed51960ce3 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -106,6 +106,13 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a */ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token); +/** + * Create item dap_chain_tx_out_cond_t with fee subtype + * + * return item, NULL Error + */ +dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a_value); + /** * Create item dap_chain_tx_out_cond_t * @@ -128,7 +135,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap * * return item, NULL Error */ -dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, long double a_fee_value, +dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, uint256_t a_fee_value, dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, dap_chain_addr_t *a_signing_addr, dap_chain_node_addr_t *a_signer_node_addr); /** diff --git a/modules/common/include/dap_chain_datum_tx_out_cond.h b/modules/common/include/dap_chain_datum_tx_out_cond.h index 39a407918d5d32de9371f72186fa62156f5b8ae5..b1f8a23daeec7a8e594832ad2644fbf84d78535d 100644 --- a/modules/common/include/dap_chain_datum_tx_out_cond.h +++ b/modules/common/include/dap_chain_datum_tx_out_cond.h @@ -33,7 +33,7 @@ enum dap_chain_tx_out_cond_subtype { DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY = 0x01, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE = 0x02, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE = 0x3, - DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_FEE = 0x04, + DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE = 0x04, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_UPDATE = 0xFA // Virtual type for stake update verificator //TODO change it to new type of callback for ledger tx add }; typedef byte_t dap_chain_tx_out_cond_subtype_t; @@ -42,7 +42,7 @@ DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_ switch (a_subtype) { case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY"; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE"; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_FEE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_FEE"; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE"; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: return "DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE"; default: {} } @@ -59,12 +59,15 @@ typedef struct dap_chain_tx_out_cond { dap_chain_tx_item_type_t item_type; /// Condition subtype dap_chain_tx_out_cond_subtype_t subtype; - /// Service uid that only could be used for this out - dap_chain_net_srv_uid_t srv_uid; /// Number of Datoshis ( DAP/10^18 ) to be reserved for service uint256_t value; /// When time expires this output could be used only by transaction owner dap_chain_time_t ts_expires; + /// Service uid that only could be used for this out + dap_chain_net_srv_uid_t srv_uid; +#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 + byte_t padding[8]; +#endif } header; union { /// Structure with specific for service pay condition subtype @@ -89,15 +92,18 @@ typedef struct dap_chain_tx_out_cond { dap_chain_addr_t hldr_addr; // Fee address dap_chain_addr_t fee_addr; - // Fee value in percent - long double fee_value; + // Fee value in percent (fixed point) + uint256_t fee_value; // Public key hash of signing certificate combined with net id dap_chain_addr_t signing_addr; // Node address of signer with this stake dap_chain_node_addr_t signer_node_addr; } srv_stake; + struct { + // Nothing here + } fee; + byte_t free_space[128]; // for future changes } subtype; - byte_t free_space[256]; // for future changes uint32_t params_size; // Condition parameters size uint8_t params[]; // condition parameters, pkey, hash or smth like this } DAP_ALIGN_PACKED dap_chain_tx_out_cond_t; diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index f6717e5f5821a75d055d4eb759f9874671234d06..7160e16435aefbbbcfc31f42fc820d4695ac7845 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -62,6 +62,7 @@ #include "dap_sign.h" #include "dap_chain_datum_tx.h" #include "dap_chain_datum_tx_items.h" +#include "dap_chain_net_srv.h" #define LOG_TAG "dap_chain_mempool" @@ -107,14 +108,12 @@ char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t */ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, - const dap_chain_addr_t* a_addr_fee, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], uint256_t a_value, uint256_t a_value_fee) { // check valid param if(!a_chain | !a_key_from || ! a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || - !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_to) || - (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || IS_ZERO_256(a_value)) + !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_to) || IS_ZERO_256(a_value)) return NULL; // find the transactions from which to take away coins @@ -141,8 +140,8 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_ if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_to, a_value) == 1) { SUM_256_256(l_value_pack, a_value, &l_value_pack); // transaction fee - if(a_addr_fee) { - if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_fee, a_value_fee) == 1) + if (!IS_ZERO_256(a_value_fee)) { + if(dap_chain_datum_tx_add_fee_item(&l_tx, a_value_fee) == 1) SUM_256_256(l_value_pack, a_value_fee, &l_value_pack); } } @@ -188,14 +187,13 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_ */ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, - const dap_chain_addr_t* a_addr_fee, const char a_token_ticker[10], uint256_t a_value, uint256_t a_value_fee,size_t a_tx_num) { // check valid param if(!a_chain | !a_key_from || !a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_to) || - (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || IS_ZERO_256(a_value) || !a_tx_num){ + IS_ZERO_256(a_value) || !a_tx_num){ log_it(L_ERROR, "Wrong parameters in dap_chain_mempool_tx_create_massive() call"); return -1; @@ -262,8 +260,8 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_to, a_value) == 1) { SUM_256_256(l_value_pack, a_value, &l_value_pack); // transaction fee - if(a_addr_fee) { - if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_fee, a_value_fee) == 1) + if (!IS_ZERO_256(a_value_fee)) { + if (dap_chain_datum_tx_add_fee_item(&l_tx_new, a_value_fee) == 1) SUM_256_256(l_value_pack, a_value_fee, &l_value_pack); } } @@ -399,7 +397,7 @@ dap_chain_datum_t *dap_chain_tx_create_cond_input(dap_chain_net_t * a_net, dap_c continue; if (l_tmp_cond->header.subtype != l_out_cond->header.subtype) continue; - if (l_tmp_cond->subtype.srv_pay.srv_uid.uint64 != l_out_cond->subtype.srv_pay.srv_uid.uint64) + if (!dap_chain_net_srv_uid_compare(l_tmp_cond->header.srv_uid, l_out_cond->header.srv_uid)) continue; if (l_tmp_cond->subtype.srv_pay.unit.uint32 != l_out_cond->subtype.srv_pay.unit.uint32) continue; diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index 8a8e4ef26518baacaaa96f734603914e1225ea11..20118221f71e784b28c6244babe033e302dab7cb 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -47,7 +47,6 @@ void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url); char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t *a_chain); dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t *a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t *a_addr_from, const dap_chain_addr_t *a_addr_to, - const dap_chain_addr_t *a_addr_fee, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], uint256_t a_value, uint256_t a_value_fee); @@ -66,11 +65,10 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * int dap_chain_mempool_tx_create_massive(dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, - const dap_chain_addr_t* a_addr_fee, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], uint256_t a_value, uint256_t a_value_fee, size_t a_tx_num); dap_chain_hash_fast_t *dap_chain_mempool_base_tx_create(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_emission_hash, dap_chain_id_t a_emission_chain_id, uint256_t a_emission_value, const char *a_ticker, dap_chain_addr_t *a_addr_to, dap_cert_t **a_certs, size_t a_certs_count); -dap_chain_datum_token_emission_t *dap_chain_mempool_emission_get(dap_chain_t *a_chain, const char *a_emission_hash_str); \ No newline at end of file +dap_chain_datum_token_emission_t *dap_chain_mempool_emission_get(dap_chain_t *a_chain, const char *a_emission_hash_str); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 7a4e8b5fed171d815c14eaf40bf2d16673b35746..7b8b3e417c10f2f83aa06bce51381b50601dd076 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -3341,7 +3341,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu switch ( l_out->header.subtype){ case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{ dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n"); - dap_string_append_printf(a_str_out,"\tsrv_uid: 0x%016"DAP_UINT64_FORMAT_x"\n", l_out->subtype.srv_pay.srv_uid.uint64 ); + dap_string_append_printf(a_str_out,"\tsrv_uid: 0x%016"DAP_UINT64_FORMAT_x"\n", l_out->header.srv_uid.uint64 ); switch (l_out->subtype.srv_pay.unit.enm) { case SERV_UNIT_UNDEFINED: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNDEFINED\n"); break; case SERV_UNIT_MB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_MB\n"); break; diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 02f8faf258e50f513f86e690190800bd5fde9e43..9a0dfc63a4fcbaf0e01d29f3ac31dea18a0a3305 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2939,19 +2939,16 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) } } + const char * l_decimals_str = NULL; if (l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_NATIVE_DECL){ - const char * l_deciamls_str = NULL; - dap_chain_node_cli_find_option_val(a_argv, 0, a_argc, "-decimals", &l_deciamls_str); - if(!l_deciamls_str) { + dap_chain_node_cli_find_option_val(a_argv, 0, a_argc, "-decimals", &l_decimals_str); + if(!l_decimals_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_decl requires parameter '-decimals'"); return -3; - } else { - l_total_supply = dap_chain_balance_scan((char *)l_deciamls_str); - if (dap_strcmp(l_deciamls_str, "18")) { - dap_chain_node_cli_set_reply_text(a_str_reply, - "token_decl support '-decimals' to be 18 only"); - return -4; - } + } else if (dap_strcmp(l_decimals_str, "18")) { + dap_chain_node_cli_set_reply_text(a_str_reply, + "token_decl support '-decimals' to be 18 only"); + return -4; } } @@ -3114,7 +3111,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) l_datum_token->header_native_decl.current_supply_256 = uint256_0; l_datum_token->header_native_decl.signs_total = l_signs_total; l_datum_token->header_native_decl.signs_valid = l_signs_emission; - + l_datum_token->header_native_decl.decimals = atoi(l_decimals_str); } // Sign header with all certificates in the list and add signs to the end of ticker declaration @@ -3852,7 +3849,6 @@ int com_tx_create(int argc, char ** argv, char **str_reply) // int cmd_num = 1; // const char *value_str = NULL; const char *addr_base58_to = NULL; - const char *addr_base58_fee = NULL; const char *str_tmp = NULL; const char * l_from_wallet_name = NULL; const char * l_token_ticker = NULL; @@ -3881,12 +3877,12 @@ int com_tx_create(int argc, char ** argv, char **str_reply) if(l_tx_num_str) l_tx_num = strtoul(l_tx_num_str, NULL, 10); - - if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-fee", &addr_base58_fee)) { - if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value_fee", &str_tmp)) { - l_value_fee = dap_chain_balance_scan(str_tmp); - } + if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-fee", &str_tmp)) { + l_value_fee = dap_chain_balance_scan(str_tmp); + } else { + l_value_fee = dap_chain_coins_to_balance("0.1"); } + if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value", &str_tmp)) { l_value = dap_chain_balance_scan(str_tmp); } @@ -3938,9 +3934,9 @@ int com_tx_create(int argc, char ** argv, char **str_reply) dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-value' to be valid uint256 value"); return -4; } - if(addr_base58_fee && IS_ZERO_256(l_value_fee)) { + if (IS_ZERO_256(l_value_fee)) { dap_chain_node_cli_set_reply_text(str_reply, - "tx_create requires parameter '-value_fee' to be valid uint256 value if '-fee' is specified"); + "tx_create requires parameter '-value_fee' to be valid uint256"); return -5; } @@ -3989,16 +3985,11 @@ int com_tx_create(int argc, char ** argv, char **str_reply) } const dap_chain_addr_t *addr_from = (const dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id); - dap_chain_addr_t *addr_fee = dap_chain_addr_from_str(addr_base58_fee); - if(!addr_from) { dap_chain_node_cli_set_reply_text(str_reply, "source address is invalid"); return -10; } - if(addr_base58_fee && !addr_fee) { - dap_chain_node_cli_set_reply_text(str_reply, "fee address is invalid"); - return -12; - } + // Check, if network ID is same as ID in destination wallet address. If not - operation is cancelled. if (l_addr_to->net_id.uint64 != l_net->pub.id.uint64) { dap_chain_node_cli_set_reply_text(str_reply, "destination wallet network ID=0x%llx and network ID=0x%llx is not equal. Please, change network name or wallet address", @@ -4008,15 +3999,13 @@ int com_tx_create(int argc, char ** argv, char **str_reply) if(l_tx_num){ res = dap_chain_mempool_tx_create_massive(l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, - l_addr_to, addr_fee, - l_token_ticker, l_value, l_value_fee, l_tx_num); + l_addr_to, l_token_ticker, l_value, l_value_fee, l_tx_num); dap_string_append_printf(string_ret, "transfer=%s\n", (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for transfer" : "False"); }else{ dap_hash_fast_t * l_tx_hash = dap_chain_mempool_tx_create(l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, l_addr_to, - addr_fee, - l_token_ticker, l_value, l_value_fee); + l_token_ticker, l_value, l_value_fee); if (l_tx_hash){ char l_tx_hash_str[80]={[0]='\0'}; dap_chain_hash_fast_to_str(l_tx_hash,l_tx_hash_str,sizeof (l_tx_hash_str)-1); @@ -4033,7 +4022,6 @@ int com_tx_create(int argc, char ** argv, char **str_reply) dap_string_free(string_ret, false); DAP_DELETE(l_addr_to); - DAP_DELETE(addr_fee); dap_chain_wallet_close(l_wallet); return res; } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index b32dad6429abbada71f97d6f7b8085405c429ed8..5dc333bd872b446425a70ac54735f0ce18fd95a3 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -361,7 +361,7 @@ static bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t\t pkey: %s\n" "\t\t\t max price: %s (%s) \n", ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32, - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64, + ((dap_chain_tx_out_cond_t*)item)->header.srv_uid.uint64, l_hash_str, dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi), dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi) @@ -371,12 +371,12 @@ static bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE: dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t addr: %s\n" - "\t\t\t value: %Lf", - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64, + "\t\t\t value: %s", + ((dap_chain_tx_out_cond_t*)item)->header.srv_uid.uint64, dap_chain_addr_to_str( - &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr - ), - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value + &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr), + dap_chain_balance_to_coins( + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value) ); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: @@ -384,7 +384,7 @@ static bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t\t net id: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t token: %s\n" "\t\t\t value: %s (%s)\n", - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64, + ((dap_chain_tx_out_cond_t*)item)->header.srv_uid.uint64, ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64, ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.token, dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value), diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index f1f25554f05a258e21fc44583d6165d88cfbf37b..f6ab77a56c20120c04f8524c139cbbac561c297e 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -638,8 +638,8 @@ int dap_chain_net_srv_parse_pricelist(dap_chain_net_srv_t *a_srv, const char *a_ } continue; case 1: - l_price->value_datoshi = dap_chain_uint256_to(dap_chain_coins_to_balance(l_price_token)); - if (!l_price->value_datoshi) { + l_price->value_datoshi = dap_chain_coins_to_balance(l_price_token); + if (IS_ZERO_256(l_price->value_datoshi)) { log_it(L_ERROR, "Error parsing pricelist: text on 2nd position \"%s\" is not floating number", l_price_token); l_iter = 0; DAP_DELETE(l_price); @@ -943,7 +943,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) { dap_chain_datum_tx_receipt_t * l_receipt = dap_chain_datum_tx_receipt_create( - a_srv->uid, a_price->units_uid, a_price->units, dap_chain_uint256_from(a_price->value_datoshi), a_ext, a_ext_size); + a_srv->uid, a_price->units_uid, a_price->units, a_price->value_datoshi, a_ext, a_ext_size); // Sign with our wallet return dap_chain_datum_tx_receipt_sign_add(l_receipt, dap_chain_wallet_get_key(a_price->wallet, 0)); } diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 87ae6a84580b6bc9f0a049cae30470c337064fef..07406de49096a8a93ae64fd376752290b332cc29 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -447,7 +447,7 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ continue; // order is corrupted } dap_chain_hash_fast_t l_hash, l_hash_gdb; - dap_hash_fast(l_orders[i].value, l_order_size, &l_hash); + dap_hash_fast(l_orders[i].value, l_orders[i].value_len, &l_hash); dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb); if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) { dap_chain_global_db_gr_del(l_orders[i].key, l_gdb_group_str); diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index ecbc6070ef1ce78a9124bfc544ec5148ee4f0e10..741cde906838da77706cdeccf10764f7ffba0bcb 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -58,7 +58,7 @@ typedef struct dap_chain_net_srv_abstract //size_t pub_key_data_size; //void * pub_key_data; - uint64_t price; // service price, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. + uint256_t price; // service price, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. uint8_t price_units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT char decription[128]; }DAP_ALIGN_PACKED dap_chain_net_srv_abstract_t; @@ -70,7 +70,7 @@ typedef struct dap_chain_net_srv_price dap_chain_wallet_t *wallet; char *net_name; dap_chain_net_t *net; - uint64_t value_datoshi; + uint256_t value_datoshi; char token[DAP_CHAIN_TICKER_SIZE_MAX]; uint64_t units; dap_chain_net_srv_price_unit_uid_t units_uid; @@ -300,7 +300,7 @@ DAP_STATIC_INLINE const char * dap_chain_net_srv_price_unit_uid_to_str( dap_chai } } -DAP_STATIC_INLINE dap_chain_net_srv_uid_compare(dap_chain_net_srv_uid_t a, dap_chain_net_srv_uid_t b) +DAP_STATIC_INLINE bool dap_chain_net_srv_uid_compare(dap_chain_net_srv_uid_t a, dap_chain_net_srv_uid_t b) { #if DAP_CHAIN_NET_SRV_UID_SIZE == 8 return a.uint64 == b.uint64; 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 4c959be7e93dc4921b90c03c0bf62ddbef6cc4c0..0923e8b8f3a0d5813a9e9c5e1669ba91562fc372 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -74,6 +74,7 @@ int dap_chain_net_srv_order_init(void); void dap_chain_net_srv_order_deinit(void); size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order); +dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t a_order_size); bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region); bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region); diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index 9b209bec77deae9fe64b673406cae254e4e8f22f..1240704382737032bb07b9a232a3ba3d486177e1 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -33,7 +33,7 @@ #define LOG_TAG "chain_net_srv_datum" -static dap_chain_net_srv *s_srv_datum = NULL; +static dap_chain_net_srv_t *s_srv_datum = NULL; static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply); void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_len); @@ -187,7 +187,7 @@ void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group, if (a_op_code == DAP_DB$K_OPTYPE_DEL) return; dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; - dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read(a_value); // Old format comliance + dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read((byte_t *)a_value, a_value_len); // Old format comliance if (!l_order) { dap_chain_global_db_gr_del(a_key, a_group); return; // order is corrupted @@ -203,7 +203,7 @@ void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group, log_it(L_DEBUG, "Price for net %s is not set", l_net->pub.name); return; // price not set for this network } - if ((l_order->price_unit != SERV_UNIT_PCS) || (l_order->direction != SERV_DIR_BUY) || + if ((l_order->price_unit.uint32 != SERV_UNIT_PCS) || (l_order->direction != SERV_DIR_BUY) || (strncmp(l_order->price_ticker, l_price->token, DAP_CHAIN_TICKER_SIZE_MAX)) || (!compare256(l_order->price, l_price->value_datoshi))) { log_it(L_DEBUG, "Price from order (%s) is not equal to price from service pricelist (%s)", @@ -230,13 +230,14 @@ void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group, log_it(L_DEBUG, "Invalid tx cond datum hash"); return; } + int l_tx_out_cond_size; dap_chain_tx_out_cond_t *l_cond_out = (dap_chain_tx_out_cond_t *) dap_chain_datum_tx_item_get(l_tx_cond, NULL, TX_ITEM_TYPE_OUT_COND, &l_tx_out_cond_size); if (!l_cond_out || l_cond_out->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY) { log_it(L_DEBUG, "Condition with required subtype SRV_PAY not found in requested tx"); } dap_hash_fast_t l_sign_hash; - if (!dap_sign_get_pkey_hash(l_order->ext_n_sign[l_order->ext_size], &l_sign_hash)) { + if (!dap_sign_get_pkey_hash((dap_sign_t *)&l_order->ext_n_sign[l_order->ext_size], &l_sign_hash)) { log_it(L_DEBUG, "Wrong order sign"); return; } diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index ac71d863c0761497e2d3a4bf620ccc565bfde297..b0cdb80a5be079fd9be85f4616a07575f022737f 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -329,7 +329,7 @@ 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 = MULT_256_FLOAT(l_outs_sum, l_stake->fee_value / 100.0); + uint256_t l_fee = {}; // TODO replace with fractional mult MULT_256_FLOAT(l_outs_sum, l_stake->fee_value / 100.0); if (compare256(l_fee_sum, l_fee) == -1) { return false; } @@ -667,8 +667,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'order create' required parameter -fee_percent"); return -11; } - long double l_fee = strtold(l_fee_str, NULL); - if (!l_fee) { + uint256_t l_fee = dap_chain_coins_to_balance(l_fee_str); + if (IS_ZERO_256(l_fee)) { dap_chain_node_cli_set_reply_text(a_str_reply, "Format -fee_percent <long double>(%)"); return -12; } @@ -743,8 +743,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'order declare' required parameter -fee_percent"); return -11; } - long double l_fee = strtold(l_fee_str, NULL); - if (!l_fee) { + uint256_t l_fee = dap_chain_coins_to_balance(l_fee_str); + if (IS_ZERO_256(l_fee)) { dap_chain_node_cli_set_reply_text(a_str_reply, "Format -fee_percent <long double>(%)"); return -12; } @@ -980,8 +980,8 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha // TODO add filters to list (token, address, etc.) l_stake = s_stake_item_from_order(l_net, l_order); char *l_addr = dap_chain_addr_to_str(&l_stake->signing_addr); - dap_string_append_printf(l_reply_str, "%s %s %s %s %Lf\n", l_orders[i].key, dap_chain_balance_print(l_stake->value), - l_stake->token, l_addr, l_stake->fee_value); + dap_string_append_printf(l_reply_str, "%s %s %s %s %s\n", l_orders[i].key, dap_chain_balance_print(l_stake->value), + l_stake->token, l_addr, dap_chain_balance_to_coins(l_stake->fee_value)); DAP_DELETE(l_addr); DAP_DELETE(l_stake); } @@ -1183,9 +1183,10 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) char *l_addr_hldr_str = dap_chain_addr_to_str(&l_stake->addr_hldr); char *l_signing_addr_str = dap_chain_addr_to_str(&l_stake->signing_addr); char *l_addr_fee_str = dap_chain_addr_to_str(&l_stake->addr_fee); - dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %Lf\n", l_tx_hash_str, l_stake->token, + dap_string_append_printf(l_reply_str, "%s %s %s %s %s %s %s\n", l_tx_hash_str, l_stake->token, dap_chain_balance_print(l_stake->value), l_addr_hldr_str, - l_signing_addr_str, l_addr_fee_str, l_stake->fee_value); + l_signing_addr_str, l_addr_fee_str, + dap_chain_balance_to_coins(l_stake->fee_value)); DAP_DELETE(l_tx_hash_str); DAP_DELETE(l_addr_hldr_str); DAP_DELETE(l_signing_addr_str); diff --git a/modules/service/stake/include/dap_chain_net_srv_stake.h b/modules/service/stake/include/dap_chain_net_srv_stake.h index d6bd14222f3265e2086fc2c982e6e7c275aa99c2..f28cdcc8a73e744fb30b2578b0ef73fe67320a11 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake.h @@ -37,7 +37,7 @@ typedef struct dap_chain_net_srv_stake_item { dap_chain_addr_t addr_hldr; dap_chain_addr_t addr_fee; dap_chain_addr_t signing_addr; - long double fee_value; + uint256_t fee_value; dap_chain_hash_fast_t tx_hash; dap_chain_node_addr_t node_addr; UT_hash_handle hh; @@ -46,7 +46,7 @@ typedef struct dap_chain_net_srv_stake_item { typedef struct dap_srv_stake_order_ext { dap_chain_addr_t addr_hldr; dap_chain_addr_t signing_addr; - long double fee_value; + uint256_t fee_value; } dap_srv_stake_order_ext_t; typedef struct dap_chain_net_srv_stake { diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 317f41073b1a791a421dff27c75fb241580771f4..16610ca7eb5453134931c4f361f4bb0aa4ff7cd0 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -557,7 +557,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) HASH_ITER(hh,PVT(l_blocks)->block_cache_first,l_block_cache, l_block_cache_tmp ) { char l_buf[50]; - ctime_r(&l_block_cache->block->hdr.ts_created, l_buf); + ctime_r((time_t *)&l_block_cache->block->hdr.ts_created, l_buf); dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s", l_block_cache->block_hash_str, l_buf); }