diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 1dd01400b6502092054dd90b3d734c50e1ccad48..ba460749c8fa62d9c055360e946733a4834aa634 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -211,9 +211,15 @@ void dap_chain_delete(dap_chain_t * a_chain) */ dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size) { - dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size); - a_chain->callback_atom_iter_delete(l_iter); + dap_chain_atom_ptr_t l_ret = NULL; + dap_chain_cell_t *l_cell, *l_iter_tmp; + HASH_ITER(hh, a_chain->cells, l_cell, l_iter_tmp) { + dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size); + a_chain->callback_atom_iter_delete(l_iter); + if (l_ret) + break; + } return l_ret; } @@ -269,13 +275,13 @@ static dap_chain_type_t s_chain_type_from_str(const char *a_type_str) static uint16_t s_datum_type_from_str(const char *a_type_str) { if(!dap_strcmp(a_type_str, "token")) { - return DAP_CHAIN_DATUM_256_TOKEN_DECL; + return DAP_CHAIN_DATUM_TOKEN_DECL; } if(!dap_strcmp(a_type_str, "emission")) { - return DAP_CHAIN_DATUM_256_TOKEN_EMISSION; + return DAP_CHAIN_DATUM_TOKEN_EMISSION; } if(!dap_strcmp(a_type_str, "transaction")) { - return DAP_CHAIN_DATUM_256_TX; + return DAP_CHAIN_DATUM_TX; } if(!dap_strcmp(a_type_str, "ca")) { return DAP_CHAIN_DATUM_CA; @@ -561,10 +567,10 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not * @param a_atom_hash * @return */ -bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash) +bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id) { bool l_ret = false; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cel_id); dap_chain_atom_ptr_t * l_lasts_atom; size_t l_lasts_atom_count=0; size_t* l_lasts_atom_size =NULL; diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 833697d368db7f3974aa6c173f9dcf68256b67e8..5d8756db08e9c0b3192169a873a21f218cf8613f 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -297,7 +297,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s // if no atom provided in arguments, we flush all the atoms in given chain size_t l_atom_size = a_atom_size ? a_atom_size : 0; size_t l_total_wrote_bytes = 0, l_count = 0; - dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain); + dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id); if (!a_atom) { fseek(a_cell->file_storage, sizeof(dap_chain_cell_file_header_t), SEEK_SET); } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 8212d226479aac152689cf123fecca483eee0695..d7f659e8d2297c39a7ca995fb43f97f720f822d7 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -144,7 +144,7 @@ typedef struct dap_chain_ledger_tx_bound { // 256 dap_chain_256_tx_out_t *tx_prev_out_256; dap_chain_256_tx_out_ext_t *tx_prev_out_ext_256; - dap_chain_256_tx_out_cond_t *tx_prev_out_cond_256; + dap_chain_tx_out_cond_t *tx_prev_out_cond_256; } out; dap_chain_ledger_tx_item_t *item_out; } dap_chain_ledger_tx_bound_t; @@ -295,7 +295,7 @@ void dap_chain_ledger_load_end(dap_ledger_t *a_ledger) * @param a_token * @return */ -int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, byte_t *a_token) +int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token) { if ( !a_ledger){ if(s_debug_more) @@ -303,7 +303,7 @@ int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, byte_t *a_toke return -1; } - dap_chain_ledger_token_item_t * l_token_item; + dap_chain_ledger_token_item_t *l_token_item; pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); HASH_FIND_STR(PVT(a_ledger)->tokens, a_token->ticker, l_token_item); pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); @@ -341,17 +341,16 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t * @param a_token_size * @return */ -int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size) +int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size) { if ( !a_ledger){ if(s_debug_more) log_it(L_ERROR, "NULL ledger, can't add datum with token declaration!"); return -1; } - dap_chain_ledger_token_item_t * l_token_item; pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); - HASH_FIND_STR(PVT(a_ledger)->tokens,a_token->ticker,l_token_item); + HASH_FIND_STR(PVT(a_ledger)->tokens, a_token->ticker,l_token_item); pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); if (l_token_item) { @@ -361,10 +360,10 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a } l_token_item = DAP_NEW_Z(dap_chain_ledger_token_item_t); - dap_snprintf(l_token_item->ticker,sizeof (l_token_item->ticker),"%s",a_token->ticker); + dap_snprintf(l_token_item->ticker,sizeof (l_token_item->ticker), "%s", a_token->ticker); pthread_rwlock_init(&l_token_item->token_emissions_rwlock,NULL); l_token_item->datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, a_token_size); - memcpy(l_token_item->datum_token, a_token,a_token_size); + memcpy(l_token_item->datum_token, a_token, a_token_size); pthread_rwlock_wrlock(&PVT(a_ledger)->tokens_rwlock); HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item); pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); @@ -392,7 +391,7 @@ int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a } if(s_debug_more) log_it(L_NOTICE, "Simple token %s added (total_supply = %s total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE )", - a_token->ticker, dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(a_token->header_private.total_supply_256)), + a_token->ticker, dap_chain_balance_to_coins(a_token->header_private.total_supply_256), a_token->header_private.signs_valid, a_token->header_private.signs_total); } break; @@ -897,7 +896,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite return 0; } -int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size) +int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size) { if (PVT(a_ledger)->last_ticker.found) { return dap_chain_ledger_token_add(a_ledger, a_token, a_token_size); @@ -1210,7 +1209,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s ): already present in cache", l_token_emission_item->datum_token_emission->hdr.value, c_token_ticker, l_hash_str); } - ret = -1; + l_ret = -1; }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_treshold_emissions_max)) { if(s_debug_more) log_it(L_WARNING,"Treshold for emissions is overfulled (%zu max)", @@ -1255,13 +1254,14 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ break; } if (l_aproves < l_aproves_valid ){ - if(s_debug_more) - if ( l_emission->hdr.version == 1 ) // && l_emission->hdr.type_256 ) // 256 + if(s_debug_more) { + if ( l_emission->hdr.version == 2 ) // 256 log_it(L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %u valid aproves when %u need", dap_chain_balance_print(l_emission->hdr.value_256), a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid ); else log_it(L_WARNING, "Emission of %"DAP_UINT64_FORMAT_U" datoshi of %s:%s is wrong: only %u valid aproves when %u need", l_emission->hdr.value, a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid ); + } l_ret = -3; } }else{ @@ -1341,7 +1341,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_ l_token_item?"emissions cache":"emissions treshold", c_dap_chain_datum_token_emission_type_str[ l_token_emission_item->datum_token_emission->hdr.type ] , dap_chain_balance_to_coins( - dap_chain_uint128_from_uint256(l_token_emission_item->datum_token_emission->hdr.value_256) + l_token_emission_item->datum_token_emission->hdr.value_256 ), c_token_ticker, l_token_emission_address_str); else @@ -2256,9 +2256,9 @@ int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * static int s_balance_cache_update(dap_ledger_t *a_ledger, dap_ledger_wallet_balance_t *a_balance) { char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR); - uint128_t *l_balance_value = DAP_NEW_Z(uint128_t); + uint256_t *l_balance_value = DAP_NEW_Z(uint256_t); *l_balance_value = a_balance->balance; - if (!dap_chain_global_db_gr_set(dap_strdup(a_balance->key), l_balance_value, sizeof(uint128_t), l_gdb_group)) { + if (!dap_chain_global_db_gr_set(dap_strdup(a_balance->key), l_balance_value, sizeof(uint256_t), l_gdb_group)) { if(s_debug_more) log_it(L_WARNING, "Ledger cache mismatch"); DAP_DELETE(l_balance_value); @@ -3280,7 +3280,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c uint32_t l_out_idx_tmp = 0; // current index of 'out' item for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) { dap_chain_tx_item_type_t l_type = *(uint8_t *)l_list_tmp->data; - uint256_t l_value = uint256_0; + uint256_t l_value = {}; switch (l_type) { case TX_ITEM_TYPE_OUT: { dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; @@ -3306,7 +3306,7 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c } break; case TX_ITEM_TYPE_256_OUT_EXT: { dap_chain_256_tx_out_ext_t *l_out_ext = (dap_chain_256_tx_out_ext_t *)l_list_tmp->data; - if ( IS_ZERO_256(l_out_ext->header.value) || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || + if (IS_ZERO_256(l_out_ext->header.value) || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || strcmp((char *)a_token_ticker, l_out_ext->token)) { continue; } @@ -3319,14 +3319,14 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c } // Check whether used 'out' items if (!dap_chain_ledger_tx_hash_is_used_out_item (a_ledger, &l_tx_cur_hash, l_out_idx_tmp)) { - list_used_item_t *item = DAP_NEW(list_used_item_t); + list_used_item_t *l_item = DAP_NEW(list_used_item_t); memcpy(&item->tx_hash_fast, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t)); - item->num_idx_out = l_out_idx_tmp; - item->value = l_value; + l_item->num_idx_out = l_out_idx_tmp; + l_item->value = l_value; l_list_used_out = dap_list_append(l_list_used_out, item); - l_value_transfer += item->value; + SUM_256_256(l_value_transfer, l_item->value, &l_value_transfer); // already accumulated the required value, finish the search for 'out' items - if (l_value_transfer >= a_value_need) { + if (compare256(l_value_transfer, a_value_need) != -1) { break; } } diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index b527a10157a490fa4cb14ac07913dc01f75c5247..7d5b068782782834ee5bb0b72f43d135034d3822 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -185,4 +185,4 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai void dap_chain_delete(dap_chain_t * a_chain); void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg); dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); -bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash); +bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id); diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index 2133380eb798b37ba9a523c2cd67748bbf790a7c..2c51681d898b514cf0fc497ef7fe2609a1dd65b6 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -122,9 +122,9 @@ int dap_chain_ledger_token_ticker_check(dap_ledger_t * a_ledger, const char *a_t * */ -int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size); -int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_token_size); -int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, byte_t *a_token); +int dap_chain_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size); +int dap_chain_ledger_token_load(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size); +int dap_chain_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token); dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger); /** * Add token emission datum diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 45185ab8387b7bb2bbf2da0af495614030819631..31e1601111f9a0744555e8572226e3c152611de9 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -1277,7 +1277,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_stream_ch_chain_sync_request_t l_request={}; dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); if( l_chain){ - dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from); // Move away from i/o reactor to callback processor + dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from, l_chain_pkt->hdr.cell_id); // Move away from i/o reactor to callback processor if( dap_log_level_get()<= L_INFO){ char l_hash_from_str[70]={[0]='\0'}; dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1); diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c index 19513bcc0bd36e6852602abe69c6299e529e4adf..b1fe5b02ff515dfb485c8cb8f814d728ee977a4c 100644 --- a/modules/common/dap_chain_common.c +++ b/modules/common/dap_chain_common.c @@ -342,7 +342,7 @@ const union { uint64_t u64[2]; uint32_t u32[4]; } c_pow10[DATOSHI_POW + 1] = { { .u64 = {5421010862427522170ULL, 687399551400673280ULL} } // 38 }; -uint128_t dap_chain_balance_scan128(char *a_balance) +uint128_t dap_chain_balance_scan128(const char *a_balance) { int l_strlen = strlen(a_balance); #ifdef DAP_GLOBAL_IS_INT128 @@ -403,13 +403,13 @@ uint128_t dap_chain_balance_scan128(char *a_balance) return l_ret; } -uint256_t dap_chain_balance_scan(char *a_balance) +uint256_t dap_chain_balance_scan(const char *a_balance) { return GET_256_FROM_128(dap_chain_balance_scan128(a_balance)); } -uint128_t dap_chain_coins_to_balance128(char *a_coins) +uint128_t dap_chain_coins_to_balance128(const char *a_coins) { #ifdef DAP_GLOBAL_IS_INT128 uint128_t l_ret = 0, l_nul = 0; @@ -454,7 +454,7 @@ uint128_t dap_chain_coins_to_balance128(char *a_coins) return l_ret; } -uint256_t dap_chain_coins_to_balance(char *a_coins) +uint256_t dap_chain_coins_to_balance(const char *a_coins) { return GET_256_FROM_128(dap_chain_coins_to_balance128(a_coins)); } diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 446d3adccece707d3dcf456a3c0969090211f05b..1263cd4bac58ed4f6db4b77c46f3d59e8e94fa5d 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -61,12 +61,11 @@ const char *c_dap_chain_datum_token_flag_str[] = { * @param a_token_size * @return */ -dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size) +dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t *a_token, size_t a_token_size) { // Check if token type could have tsd section - size_t l_hdr_size = sizeof(*a_token); size_t l_tsd_size; - + size_t l_hdr_size = sizeof(dap_chain_datum_token_old_t); if (l_hdr_size > a_token_size){ log_it(L_WARNING, "Token size smaller then header, corrupted data"); return NULL; @@ -74,13 +73,15 @@ dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size switch( a_token->type){ case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + l_hdr_size = sizeof(dap_chain_datum_token_t); case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: l_tsd_size = a_token->header_private_decl.tsd_total_size; - break; + break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + l_hdr_size = sizeof(dap_chain_datum_token_t); case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: l_tsd_size = a_token->header_private_update.tsd_total_size; - break; + break; default: return NULL; } @@ -230,15 +231,18 @@ dap_sign_t ** dap_chain_datum_token_simple_signs_parse(dap_chain_datum_token_t * assert(a_datum_token); assert(a_signs_total); assert(a_signs_valid); - assert( a_datum_token_size >= sizeof (a_datum_token)); + assert(a_datum_token_size >= sizeof(dap_chain_datum_token_old_t)); dap_sign_t ** l_ret = DAP_NEW_Z_SIZE(dap_sign_t*, sizeof (dap_sign_t*)*a_datum_token->header_private.signs_total ); *a_signs_total=0; *a_signs_valid = a_datum_token->header_private.signs_valid; size_t l_offset = 0; uint16_t n = 0; + size_t l_signs_offset = a_datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE + ? sizeof(dap_chain_datum_token_old_t) + : sizeof(dap_chain_datum_token_t); - while( l_offset < (a_datum_token_size-sizeof (a_datum_token) ) && n < a_datum_token->header_private.signs_total ) { - dap_sign_t *l_sign = (dap_sign_t *) ( a_datum_token->data_n_tsd + l_offset); + while( l_offset < (a_datum_token_size - l_signs_offset) && n < a_datum_token->header_private.signs_total ) { + dap_sign_t *l_sign = (dap_sign_t *)((byte_t *)a_datum_token + l_signs_offset + l_offset); size_t l_sign_size = dap_sign_get_size(l_sign); if(!l_sign_size ){ log_it(L_WARNING,"Corrupted signature: size is zero"); diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index e9a0001fb118a74f8654fa1817bb67dd6ace6a78..61c2784302d8f2add684585de4337a69c3fe7727 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -104,14 +104,14 @@ int dap_chain_datum_tx_add_in_item(dap_chain_datum_tx_t **a_tx, dap_chain_hash_f * * return summary value from inserted items */ -uint64_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out) +uint256_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out) { dap_list_t *l_list_tmp = a_list_used_out; - uint64_t l_value_to_items = 0; // how many datoshi to transfer + uint256_t l_value_to_items = {}; // how many datoshi to transfer while (l_list_tmp) { - list_used_item_t *item = l_list_tmp->data; - if (dap_chain_datum_tx_add_in_item(a_tx, &item->tx_hash_fast, item->num_idx_out) == 1) { - l_value_to_items += item->value; + list_used_item_t *l_item = l_list_tmp->data; + if (dap_chain_datum_tx_add_in_item(a_tx, &l_item->tx_hash_fast, l_item->num_idx_out) == 1) { + SUM_256_256(l_value_to_items, l_item->value, &l_value_to_items); } l_list_tmp = dap_list_next(l_list_tmp); } @@ -182,7 +182,7 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_cond, size_t a_cond_size) { - dap_chain_256_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay( + dap_chain_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_out_cond_create_srv_pay( a_key, a_srv_uid,a_value, a_value_max_per_unit, a_unit, a_cond, a_cond_size ); if(l_tx_out) { dap_chain_datum_tx_add_item(a_tx, (const uint8_t *) l_tx_out); diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index a67bd64bea74e853598a26db1ef0731305255afc..8562a823c0b7aabf5c18b1733f6f6a00fdafa15c 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -86,13 +86,6 @@ static size_t dap_chain_tx_out_cond_get_size(const dap_chain_tx_out_cond_t *a_it return sizeof(dap_chain_tx_out_cond_t) + a_item->params_size; } -// 256 -static size_t dap_chain_256_tx_out_cond_get_size(const dap_chain_256_tx_out_cond_t *a_item) -{ - return sizeof(dap_chain_256_tx_out_cond_t) + a_item->params_size; -} - - static size_t dap_chain_tx_pkey_get_size(const dap_chain_tx_pkey_t *a_item) { size_t size = sizeof(dap_chain_tx_pkey_t) + a_item->header.sig_size; @@ -155,10 +148,10 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item) size = dap_chain_tx_in_cond_get_size((const dap_chain_tx_in_cond_t*) a_item); break; case TX_ITEM_TYPE_OUT_COND: // Transaction output with condition - size = dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t*) a_item); + size = 0; // obsolete dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t*) a_item); break; case TX_ITEM_TYPE_256_OUT_COND: // 256 - size = dap_chain_256_tx_out_cond_get_size((const dap_chain_256_tx_out_cond_t*) a_item); + size = dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t *)a_item); break; case TX_ITEM_TYPE_PKEY: // Transaction public keys size = dap_chain_tx_pkey_get_size((const dap_chain_tx_pkey_t*) a_item); @@ -260,7 +253,7 @@ dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_cha * * return item, NULL Error */ -dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_params, size_t a_params_size) @@ -271,7 +264,7 @@ dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); - dap_chain_256_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_256_tx_out_cond_t, sizeof(dap_chain_256_tx_out_cond_t) + a_params_size); + 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) return NULL; @@ -287,14 +280,14 @@ dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap return l_item; } -dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id, +dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id, const char *a_token, uint256_t a_value, const void *a_params, uint32_t a_params_size) { if (!a_token) { return NULL; } - dap_chain_256_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_256_tx_out_cond_t, sizeof(dap_chain_256_tx_out_cond_t) + a_params_size); + 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_256_OUT_COND; l_item->header.value = a_value; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE; @@ -308,11 +301,11 @@ dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange return l_item; } -dap_chain_256_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, long double a_fee_value, dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, const void *a_params, uint32_t a_params_size) { - dap_chain_256_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_256_tx_out_cond_t, sizeof(dap_chain_256_tx_out_cond_t) + a_params_size); + 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_256_OUT_COND; l_item->header.value = a_value; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE; @@ -448,23 +441,3 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a } return l_res; } - -// 256 -dap_chain_256_tx_out_cond_t *dap_chain_datum_256_tx_out_cond_get(dap_chain_datum_tx_t *a_tx, int *a_out_num) -{ - dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_ALL, NULL); - int l_prev_cond_idx = l_list_out_items ? 0 : -1; - dap_chain_256_tx_out_cond_t *l_res = NULL; - for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_prev_cond_idx++) { - if (*(uint8_t *)l_list_tmp->data == TX_ITEM_TYPE_256_OUT_COND) { - l_res = l_list_tmp->data; - break; - } - } - dap_list_free(l_list_out_items); - if (a_out_num) { - *a_out_num = l_prev_cond_idx; - } - return l_res; -} - diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index 58e0e3250ff5b9d73548116c711e5091d5af5b5c..570c0ad518be4cf006d04c7634fb4c6a63a4c876 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -189,7 +189,7 @@ typedef union { serv_unit_enum_t enm; } dap_chain_net_srv_price_unit_uid_t; -typedef enum dap_chain_tx_item_type { +enum dap_chain_tx_item_type { TX_ITEM_TYPE_IN = 0x00, /// @brief Transaction: inputs TX_ITEM_TYPE_OUT = 0x10, /// @brief Transaction: outputs @@ -211,17 +211,15 @@ typedef enum dap_chain_tx_item_type { TX_ITEM_TYPE_OUT_ALL = 0xfe, TX_ITEM_TYPE_ANY = 0xff -} dap_chain_tx_item_type_t; +}; +typedef uint32_t dap_chain_tx_item_type_t; typedef struct dap_chain_receipt{ dap_chain_net_srv_uid_t srv_uid; // Service UID dap_chain_net_srv_price_unit_uid_t units_type; uint64_t units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT - union { - uint64_t value_datoshi; // Receipt value - uint256_t value_datoshi_256; - }; + uint64_t value_datoshi; // Receipt value } dap_chain_receipt_info_t; #ifdef __cplusplus @@ -284,8 +282,8 @@ uint64_t dap_chain_uint256_to(uint256_t a_from); char *dap_chain_balance_print(uint256_t a_balance); char *dap_chain_balance_to_coins(uint256_t a_balance); -uint256_t dap_chain_balance_scan(char *a_balance); -uint256_t dap_chain_coins_to_balance(char *a_coins); +uint256_t dap_chain_balance_scan(const char *a_balance); +uint256_t dap_chain_coins_to_balance(const char *a_coins); /** * @brief dap_chain_hash_to_str diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h index 88f8dc13dd88136ba32cd18574f7035b19009d1d..a657e20d69e964b9b53cb97e8a8a6317ba33b871 100644 --- a/modules/common/include/dap_chain_datum.h +++ b/modules/common/include/dap_chain_datum.h @@ -58,7 +58,6 @@ /// Token /// Simple token decl #define DAP_CHAIN_DATUM_TOKEN_DECL 0xf000 -#define DAP_CHAIN_DATUM_256_TOKEN_DECL 0xf001 // 256 #define DAP_CHAIN_DATUM_TOKEN_EMISSION 0xf100 #define DAP_CHAIN_DATUM_TOKEN_DISMISSAL 0xf200 @@ -84,8 +83,6 @@ s = "DATUM_CUSTOM"; break; \ case DAP_CHAIN_DATUM_TOKEN_DECL: \ s = "DATUM_TOKEN_DECL"; break; \ - case DAP_CHAIN_DATUM_256_TOKEN_DECL: \ - s = "DATUM_256_TOKEN_DECL"; break; \ case DAP_CHAIN_DATUM_TOKEN_EMISSION:\ s = "DATUM_TOKEN_EMISSION"; break;\ default: \ diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index efdb862da715075293eb0c869bdcc234ba9ef692..36feedde4bba31592f7fefadd12656b5586b624b 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -114,13 +114,13 @@ typedef struct dap_chain_datum_token{ // 256 // Simple private token decl -#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE 0x0005 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE 0x0005 // Extended declaration of privatetoken with in-time control -#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL 0x0006 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL 0x0006 // Token update -#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE 0x0007 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE 0x0007 // Open token with now ownership -#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC 0x0008 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC 0x0008 // Macros for token flags diff --git a/modules/common/include/dap_chain_datum_tx.h b/modules/common/include/dap_chain_datum_tx.h index e36f33ac1c2795341430373c40bec348010b4cf0..c6b9c79f3d4e87c4fa817ab9586eea1d93714067 100644 --- a/modules/common/include/dap_chain_datum_tx.h +++ b/modules/common/include/dap_chain_datum_tx.h @@ -79,7 +79,7 @@ int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_it * * return summary value from inserted items */ -uint64_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out); +uint256_t dap_chain_datum_tx_add_in_item_list(dap_chain_datum_tx_t **a_tx, dap_list_t *a_list_used_out); /** * Create 'in' item and insert to transaction diff --git a/modules/common/include/dap_chain_datum_tx_in.h b/modules/common/include/dap_chain_datum_tx_in.h index 780c710c9aaa8d10cff8bd14b915b502121db4d8..b9fcbc2801aacc75ed0ed7b8dc6f273e8e9cf166 100644 --- a/modules/common/include/dap_chain_datum_tx_in.h +++ b/modules/common/include/dap_chain_datum_tx_in.h @@ -48,6 +48,5 @@ typedef struct list_used_item { dap_chain_hash_fast_t tx_hash_fast; uint32_t num_idx_out; uint8_t padding[4]; - uint64_t value; -//dap_chain_tx_out_t *tx_out; + uint256_t value; } list_used_item_t; diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index e2d7da798704dda829409178117c537a259f1c9a..7682123a68df5fd9c02aaab274d4e4ddd4d3fe2f 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -113,7 +113,7 @@ dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_cha * * return item, NULL Error */ -dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, uint256_t a_value_max_per_unit, dap_chain_net_srv_price_unit_uid_t a_unit, const void *a_params, size_t a_params_size); @@ -122,7 +122,7 @@ dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap * * return item, NULL Error */ -dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id, const char *a_token, uint256_t a_value, const void *a_params, uint32_t a_params_size); /** @@ -130,7 +130,7 @@ dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange * * return item, NULL Error */ -dap_chain_256_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, long double a_fee_value, dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, const void *a_params, uint32_t a_params_size); /** @@ -163,4 +163,3 @@ uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_id dap_list_t* dap_chain_datum_tx_items_get(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int *a_item_count); // Get conditional out item with it's idx dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a_tx, int *a_out_num); -dap_chain_256_tx_out_cond_t *dap_chain_datum_256_tx_out_cond_get(dap_chain_datum_tx_t *a_tx, int *a_out_num); 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 de61d36934ec879e6fd58cb180acea921a4b8145..f98afa1ac91b82438cacbac2af771d036bd95e71 100644 --- a/modules/common/include/dap_chain_datum_tx_out_cond.h +++ b/modules/common/include/dap_chain_datum_tx_out_cond.h @@ -51,14 +51,14 @@ DAP_STATIC_INLINE const char *dap_chain_tx_out_cond_subtype_to_str(dap_chain_tx_ * @struct dap_chain_tx_out * @brief Transaction item out_cond */ -typedef struct dap_chain_tx_out_cond { // Absolete +typedef struct dap_chain_tx_out_cond { struct { /// Transaction item type dap_chain_tx_item_type_t item_type; /// Condition subtype dap_chain_tx_out_cond_subtype_t subtype; /// Number of Datoshis ( DAP/10^9 ) to be reserver for service - uint64_t value; + uint256_t value; /// When time expires this output could be used only by transaction owner dap_chain_time_t ts_expires; } header; @@ -72,7 +72,7 @@ typedef struct dap_chain_tx_out_cond { // Absolete /// Price unit thats used to check price max dap_chain_net_srv_price_unit_uid_t unit; /// Maximum price per unit - uint64_t unit_price_max_datoshi; + uint256_t unit_price_max_datoshi; } srv_pay; struct { // Service uid that only could be used for this outout @@ -82,7 +82,7 @@ typedef struct dap_chain_tx_out_cond { // Absolete // Chain network to change to dap_chain_net_id_t net_id; // Total amount of datoshi to change to - uint64_t value; + uint256_t value; } srv_xchange; struct { // Service uid that only could be used for this outout @@ -104,14 +104,14 @@ typedef struct dap_chain_tx_out_cond { // Absolete * @struct dap_chain_tx_out * @brief Transaction item out_cond */ -typedef struct dap_chain_256_tx_out_cond { +typedef struct dap_chain_tx_out_cond_old { // Obsolete struct { /// Transaction item type dap_chain_tx_item_type_t item_type; /// Condition subtype dap_chain_tx_out_cond_subtype_t subtype; /// Number of Datoshis ( DAP/10^9 ) to be reserver for service - uint256_t value; + uint64_t value; /// When time expires this output could be used only by transaction owner dap_chain_time_t ts_expires; } header; @@ -125,7 +125,7 @@ typedef struct dap_chain_256_tx_out_cond { /// Price unit thats used to check price max dap_chain_net_srv_price_unit_uid_t unit; /// Maximum price per unit - uint256_t unit_price_max_datoshi; + uint64_t unit_price_max_datoshi; } srv_pay; struct { // Service uid that only could be used for this outout @@ -135,7 +135,7 @@ typedef struct dap_chain_256_tx_out_cond { // Chain network to change to dap_chain_net_id_t net_id; // Total amount of datoshi to change to - uint256_t value; + uint64_t value; } srv_xchange; struct { // Service uid that only could be used for this outout @@ -150,8 +150,4 @@ typedef struct dap_chain_256_tx_out_cond { } subtype; uint32_t params_size; // Condition parameters size uint8_t params[]; // condition parameters, pkey, hash or smth like this -} DAP_ALIGN_PACKED dap_chain_256_tx_out_cond_t; - - - - +} DAP_ALIGN_PACKED dap_chain_tx_out_cond_old_t; diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index b797bb262353a0967f2ba54a00c043f0ffce6133..cbf2be24960f8cd72887122d2aa4fb21a69a277c 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -344,9 +344,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha return ATOM_REJECT; } switch (l_datum->header.type_id) { - case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256 case DAP_CHAIN_DATUM_TOKEN_DECL:{ - if (dap_chain_ledger_token_load(a_chain->ledger, l_datum->data, l_datum->header.data_size)) + if (dap_chain_ledger_token_load(a_chain->ledger, (dap_chain_datum_token_t *)l_datum->data, l_datum->header.data_size)) return ATOM_REJECT; }break; case DAP_CHAIN_DATUM_TOKEN_EMISSION: { diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 5137d4f72a4e28e17d7b5dbd4a97d1b575caf958..4e627b81fef772a986c14dd08deb05842c2fede5 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -112,11 +112,11 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_ // 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)) || !a_value) + (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || IS_ZERO_256(a_value)) return NULL; // find the transactions from which to take away coins - uint256_t l_value_transfer = 0; // how many coins to transfer + uint256_t l_value_transfer = {}; // how many coins to transfer uint256_t l_value_need; SUM_256_256(a_value, a_value_fee, &l_value_need); dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker, @@ -129,8 +129,8 @@ dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_ dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); // add 'in' items { - uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); - assert(l_value_to_items == l_value_transfer); + uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); + assert(EQUAL_256(l_value_to_items, l_value_transfer)); dap_list_free_full(l_list_used_out, free); } // add 'out' items @@ -186,24 +186,27 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a 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], - uint64_t a_value, uint64_t a_value_fee,size_t a_tx_num) + 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)) || !a_value || !a_tx_num){ + (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || IS_ZERO_256(a_value) || !a_tx_num){ log_it(L_ERROR, "Wrong parameters in dap_chain_mempool_tx_create_massive() call"); return -1; } - dap_global_db_obj_t * l_objs = DAP_NEW_Z_SIZE(dap_global_db_obj_t, (a_tx_num+1)*sizeof (dap_global_db_obj_t) ); + dap_global_db_obj_t * l_objs = DAP_NEW_Z_SIZE(dap_global_db_obj_t, (a_tx_num + 1) * sizeof (dap_global_db_obj_t)); // Search unused out: - uint64_t l_value_need =a_tx_num*( a_value + a_value_fee ); - uint64_t l_value_transfer = 0; // how many coins to transfer - log_it(L_DEBUG,"Create %"DAP_UINT64_FORMAT_U" transactions, summary %Lf.7", a_tx_num,dap_chain_datoshi_to_coins(l_value_need) ) ; + uint256_t l_single_val = {}; + SUM_256_256(a_value, a_value_fee, &l_single_val); + uint256_t l_value_need = {}; + MULT_256_256(dap_chain_uint256_from(a_tx_num), l_single_val, &l_value_need); + uint256_t l_value_transfer = {}; // how many coins to transfer + log_it(L_DEBUG,"Create %"DAP_UINT64_FORMAT_U" transactions, summary %s", a_tx_num, dap_chain_balance_to_coins(l_value_need)) ; dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(a_chain->ledger, a_token_ticker, a_addr_from, l_value_need, &l_value_transfer); if (!l_list_used_out) { @@ -218,52 +221,52 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a // create empty transaction dap_chain_datum_tx_t *l_tx_new = dap_chain_datum_tx_create(); - uint64_t l_value_back=0; + uint256_t l_value_back = {}; // add 'in' items dap_list_t *l_list_tmp = l_list_used_out; - uint64_t l_value_to_items = 0; // how many coins to transfer + uint256_t l_value_to_items = {}; // how many coins to transfer // Add in and remove out used items while(l_list_tmp) { - list_used_item_t *item = l_list_tmp->data; + list_used_item_t *l_item = l_list_tmp->data; char l_in_hash_str[70]; - dap_chain_hash_fast_to_str(&item->tx_hash_fast,l_in_hash_str,sizeof (l_in_hash_str) ); + dap_chain_hash_fast_to_str(&l_item->tx_hash_fast,l_in_hash_str,sizeof (l_in_hash_str) ); - if(dap_chain_datum_tx_add_in_item(&l_tx_new, &item->tx_hash_fast, (uint32_t) item->num_idx_out) == 1) { - l_value_to_items += item->value; - log_it(L_DEBUG,"Added input %s with %"DAP_UINT64_FORMAT_U" datoshi",l_in_hash_str, item->value); + if(dap_chain_datum_tx_add_in_item(&l_tx_new, &l_item->tx_hash_fast, (uint32_t)l_item->num_idx_out) == 1) { + SUM_256_256(l_value_to_items, l_item->value, &l_value_to_items); + log_it(L_DEBUG, "Added input %s with %s datoshi", l_in_hash_str, dap_chain_balance_print(l_item->value)); }else{ - log_it(L_WARNING,"Can't add input from %s with %"DAP_UINT64_FORMAT_U" datoshi",l_in_hash_str, item->value); + log_it(L_WARNING, "Can't add input from %s with %s datoshi", l_in_hash_str, dap_chain_balance_print(l_item->value)); } l_list_used_out = l_list_tmp->next; DAP_DELETE(l_list_tmp->data); dap_list_free1(l_list_tmp); l_list_tmp = l_list_used_out; - if ( l_value_to_items >= l_value_transfer ) + if (compare256(l_value_to_items, l_value_transfer) != -1) break; } - if ( l_value_to_items < (a_value + a_value_fee) ){ - log_it(L_ERROR,"Not enought values on output %"DAP_UINT64_FORMAT_U" to produce enought ins %"DAP_UINT64_FORMAT_U" when need %"DAP_UINT64_FORMAT_U"", - l_value_to_items, l_value_transfer, - l_value_need); + if (compare256(l_value_to_items, l_single_val) == -1) { + log_it(L_ERROR, "Not enought values on output %s to produce enought ins %s when need %s", + dap_chain_balance_print(l_value_to_items), dap_chain_balance_print(l_value_transfer), + dap_chain_balance_print(l_value_need)); DAP_DELETE(l_objs); return -5; } // add 'out' items - uint64_t l_value_pack = 0; // how much coin add to 'out' items + uint256_t l_value_pack = {}; // how much coin add to 'out' items if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_to, a_value) == 1) { - l_value_pack += a_value; + 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) - l_value_pack += a_value_fee; + SUM_256_256(l_value_pack, a_value_fee, &l_value_pack); } } // coin back - l_value_back = l_value_transfer - l_value_pack; - if(l_value_back) { + SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back); + if (!IS_ZERO_256(l_value_back)) { //log_it(L_DEBUG,"Change back %"DAP_UINT64_FORMAT_U"", l_value_back); if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_from, l_value_back) != 1) { dap_chain_datum_tx_delete(l_tx_new); @@ -282,7 +285,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a dap_chain_hash_fast_t l_tx_new_hash; dap_hash_fast(l_tx_new, l_tx_size, &l_tx_new_hash); // If we have value back - update balance cache - if(l_value_back) { + if (!IS_ZERO_256(l_value_back)) { //log_it(L_DEBUG,"We have value back %"DAP_UINT64_FORMAT_U" now lets see how many outputs we have", l_value_back); int l_item_count = 0; dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get( l_tx_new, TX_ITEM_TYPE_OUT, @@ -312,7 +315,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a //log_it(L_DEBUG,"Checked all outputs"); dap_list_free( l_list_out_items); } - l_value_transfer -= l_value_pack; + SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_transfer); // Now produce datum dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx_new, l_tx_size); @@ -322,7 +325,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a l_objs[i].key = dap_chain_hash_fast_to_str_new(&l_tx_new_hash); //continue; - l_objs[i].value = (uint8_t*) l_datum; + l_objs[i].value = (uint8_t *)l_datum; l_objs[i].value_len = l_tx_size + sizeof(l_datum->header); log_it(L_DEBUG, "Prepared obj with key %s (value_len = %"DAP_UINT64_FORMAT_U")", l_objs[i].key? l_objs[i].key :"NULL" , l_objs[i].value_len ); @@ -364,10 +367,10 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * // create empty transaction dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); - uint16_t pos=0; + uint16_t pos = 0; dap_chain_datum_tx_add_item(&l_tx, (byte_t*) l_receipt); pos++; - uint64_t l_value_send = l_receipt->receipt_info.value_datoshi; + uint256_t l_value_send = dap_chain_uint256_from(l_receipt->receipt_info.value_datoshi); // add 'in_cond' items dap_chain_datum_tx_t *l_tx_cond = dap_chain_ledger_tx_find_by_hash(l_ledger, a_tx_prev_hash); @@ -377,10 +380,10 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * dap_chain_datum_tx_t *l_tx_tmp; dap_chain_hash_fast_t l_tx_cur_hash = { 0 }; // start hash dap_chain_tx_out_cond_t *l_tmp_cond; - uint64_t l_value_cond = 0; + uint256_t l_value_cond = {}; int l_tmp_cond_idx; // Find all transactions - while (l_value_cond < l_value_send) { + while (compare256(l_value_cond, l_value_send) == -1) { l_tx_tmp = dap_chain_ledger_tx_cache_find_out_cond(l_ledger, &l_tx_cur_hash, &l_tmp_cond, &l_tmp_cond_idx, NULL); if (!l_tx_tmp) { break; @@ -393,18 +396,18 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * continue; if (l_tmp_cond->subtype.srv_pay.unit.uint32 != l_out_cond->subtype.srv_pay.unit.uint32) continue; - if (l_tmp_cond->subtype.srv_pay.unit_price_max_datoshi != l_out_cond->subtype.srv_pay.unit_price_max_datoshi) + if (!EQUAL_256(l_tmp_cond->subtype.srv_pay.unit_price_max_datoshi, l_out_cond->subtype.srv_pay.unit_price_max_datoshi)) continue; if (memcmp(&l_tmp_cond->subtype.srv_pay.pkey_hash, &l_out_cond->subtype.srv_pay.pkey_hash, sizeof(dap_chain_hash_fast_t))) continue; l_value_cond = l_tmp_cond->header.value; } - if (l_value_cond < l_value_send) { + if (compare256(l_value_cond, l_value_send) == -1) { log_it(L_WARNING, "Requested conditional transaction is already used out"); return NULL; } } - if (dap_chain_datum_tx_add_in_cond_item(&l_tx, a_tx_prev_hash, l_prev_cond_idx, pos-1) != 0 ){ + if (dap_chain_datum_tx_add_in_cond_item(&l_tx, a_tx_prev_hash, l_prev_cond_idx, pos - 1) != 0 ){ dap_chain_datum_tx_delete(l_tx); log_it( L_ERROR, "Cant add tx cond input"); return NULL; @@ -421,7 +424,7 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * size_t l_size = dap_chain_datum_item_tx_get_size((uint8_t *)l_out_cond); dap_chain_tx_out_cond_t *l_out_cond_new = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, l_size); memcpy(l_out_cond_new, l_out_cond, l_size); - l_out_cond_new->header.value -= l_value_send; + SUBTRACT_256_256(l_out_cond_new->header.value, l_value_send, &l_out_cond_new->header.value); dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *)l_out_cond_new); DAP_DELETE(l_out_cond_new); @@ -468,19 +471,20 @@ static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t * a_net, dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, const dap_chain_addr_t* a_addr_from, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, - dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) + uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size) { dap_ledger_t * l_ledger = a_net ? dap_chain_ledger_by_net_name( a_net->pub.name ) : NULL; // check valid param if(!a_net || ! l_ledger || !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || !dap_chain_addr_check_sum(a_addr_from) || - !a_value) + IS_ZERO_256(a_value)) return NULL; // find the transactions from which to take away coins - uint64_t l_value_transfer = 0; // how many coins to transfer - uint64_t l_value_need = a_value + a_value_fee; + uint256_t l_value_transfer = {}; // how many coins to transfer + uint256_t l_value_need = {}; + SUM_256_256(a_value, a_value_fee, &l_value_need); // list of transaction with 'out' items dap_list_t *l_list_used_out = dap_chain_ledger_get_list_tx_outs_with_val(l_ledger, a_token_ticker, a_addr_from, l_value_need, &l_value_transfer); @@ -493,24 +497,25 @@ static dap_chain_datum_t* dap_chain_tx_create_cond(dap_chain_net_t * a_net, dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); // add 'in' items { - uint64_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); - assert(l_value_to_items == l_value_transfer); + uint256_t l_value_to_items = dap_chain_datum_tx_add_in_item_list(&l_tx, l_list_used_out); + assert(EQUAL_256(l_value_to_items, l_value_transfer)); dap_list_free_full(l_list_used_out, free); } // add 'out_cond' and 'out' items { - uint64_t l_value_pack = 0; // how much coin add to 'out' items + uint256_t l_value_pack = {}; // how much coin add to 'out' items if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, a_srv_uid, a_value, a_value_per_unit_max, a_unit, a_cond, a_cond_size) == 1) { - l_value_pack += a_value; + SUM_256_256(l_value_pack, a_value, &l_value_pack); // transaction fee - if(a_value_fee) { + if (!IS_ZERO_256(a_value_fee)) { // TODO add condition with fee for mempool-as-service } } // coin back - uint64_t l_value_back = l_value_transfer - l_value_pack; - if(l_value_back) { + uint256_t l_value_back = {}; + SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_back); + if (!IS_ZERO_256(l_value_back)) { if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) { dap_chain_datum_tx_delete(l_tx); log_it( L_ERROR, "Cant add coin back output"); @@ -555,8 +560,8 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net, dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, const dap_chain_addr_t* a_addr_from, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, - dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) + uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size) { dap_chain_t *l_chain = NULL; @@ -569,8 +574,8 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net, return NULL; // Make transfer transaction dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, a_addr_from, - a_token_ticker,a_value,a_value_per_unit_max, a_unit, - a_srv_uid, a_value_fee, a_cond, a_cond_size); + a_token_ticker, a_value, a_value_per_unit_max, a_unit, + a_srv_uid, a_value_fee, a_cond, a_cond_size); if(!l_datum) return NULL; @@ -597,13 +602,13 @@ dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, const dap_chain_addr_t* a_addr_from, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, - dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) + uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size) { // Make transfer transaction - dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net,a_key_from, a_key_cond, a_addr_from, - a_token_ticker,a_value,a_value_per_unit_max, a_unit, - a_srv_uid, a_value_fee, a_cond, a_cond_size); + dap_chain_datum_t *l_datum = dap_chain_tx_create_cond(a_net, a_key_from, a_key_cond, a_addr_from, + a_token_ticker,a_value,a_value_per_unit_max, a_unit, + a_srv_uid, a_value_fee, a_cond, a_cond_size); if(!l_datum) return NULL; diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index b4b81ae28befc9c62393864fb5c46690f7625bd6..631459d42c9959e90e2884f7b14942945313f5be 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -55,20 +55,20 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net, dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, const dap_chain_addr_t* a_addr_from, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, - dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size); + uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size); dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net, dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond, const dap_chain_addr_t* a_addr_from, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX], - uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, - dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size); + uint256_t a_value, uint256_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit, + dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value_fee, const void *a_cond, size_t a_cond_size); dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond_input(dap_chain_net_t * a_net,dap_chain_hash_fast_t *a_tx_prev_hash, const dap_chain_addr_t* a_addr_to, dap_enc_key_t * l_key_tx_sign, dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size); -int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a_key_from, +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], - uint64_t a_value, uint64_t a_value_fee,size_t a_tx_num); + uint256_t a_value, uint256_t a_value_fee, size_t a_tx_num); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index b5907395a348d991cbf2e3de864d832c612390e1..69b5e3706e062811ed8eed6ca26956b0f9a7f7f1 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2599,9 +2599,8 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t switch ( a_datum->header.type_id) { case DAP_CHAIN_DATUM_TX: return dap_chain_ledger_tx_add_check( a_net->pub.ledger, (dap_chain_datum_tx_t*)a_datum->data ); - case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256 case DAP_CHAIN_DATUM_TOKEN_DECL: - return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger, a_datum->data ); + return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger, (dap_chain_datum_token_t *)a_datum->data); case DAP_CHAIN_DATUM_TOKEN_EMISSION: return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, a_datum->data, a_datum->header.data_size ); default: return 0; @@ -2624,7 +2623,6 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu return; } switch (a_datum->header.type_id){ - case DAP_CHAIN_DATUM_256_TOKEN_DECL: case DAP_CHAIN_DATUM_TOKEN_DECL:{ size_t l_token_size = a_datum->header.data_size; dap_chain_datum_token_t * l_token = dap_chain_datum_token_read(a_datum->data, &l_token_size); @@ -2934,7 +2932,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str ); } break; case TX_ITEM_TYPE_256_OUT_COND: { // 256 - dap_chain_256_tx_out_cond_t * l_out = l_cur->data; + dap_chain_tx_out_cond_t * l_out = l_cur->data; dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_balance_print(l_out->header.value) ); switch ( l_out->header.subtype){ case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{ @@ -2969,7 +2967,7 @@ void dap_chain_net_dump_datum(dap_string_t *a_str_out, dap_chain_datum_t *a_datu dap_string_append_printf(a_str_out,"\tparams_size : %u\n", l_out->params_size ); } break; case TX_ITEM_TYPE_OUT_COND:{ - dap_chain_tx_out_cond_t * l_out = l_cur->data; + dap_chain_tx_out_cond_old_t * l_out = l_cur->data; dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out->header.value ); switch ( l_out->header.subtype){ case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{ diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 5902c2be5337531df8a5cf19f97e4425d10e3ccd..fd583f31cadafe959f4ef204b1ad73bdc81e3643 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3091,7 +3091,7 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) return -8; } - dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_256_TOKEN_DECL, + dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_DECL, l_datum_token, sizeof(*l_datum_token) + l_datum_data_offset); size_t l_datum_size = dap_chain_datum_size(l_datum); @@ -3429,8 +3429,7 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) const char * l_net_name = NULL; const char * l_unit_str = NULL; const char * l_service_str = NULL; - uint64_t l_value_datoshi = 0; - + uint256_t l_value_datoshi = {}; const char * l_hash_out_type = NULL; dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); if(!l_hash_out_type) @@ -3512,8 +3511,8 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) return -9; } - l_value_datoshi = strtoll(l_value_datoshi_str, NULL, 10); - if(!l_value_datoshi) { + l_value_datoshi = dap_chain_balance_scan(l_value_datoshi_str); + if(IS_ZERO_256(l_value_datoshi)) { dap_chain_node_cli_set_reply_text(a_str_reply, "can't recognize value='%s' as a number", l_value_datoshi_str); return -10; } @@ -3553,9 +3552,10 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) addr_cond, NULL, l_token_ticker, l_value, 0, (const void*) &l_cond, sizeof(dap_chain_net_srv_abstract_t)); */ - + uint256_t l_value_per_unit_max = {}; + uint256_t l_value_fee = {}; dap_chain_hash_fast_t *l_tx_cond_hash = dap_chain_mempool_tx_create_cond(l_net, l_key_from, l_key_cond, l_addr_from, l_token_ticker, - l_value_datoshi, 0, l_price_unit, l_srv_uid, 0, NULL, 0); + l_value_datoshi, l_value_per_unit_max, l_price_unit, l_srv_uid, l_value_fee, NULL, 0); dap_chain_wallet_close(l_wallet_from); dap_chain_wallet_close(l_wallet_cond); @@ -3803,8 +3803,8 @@ int com_tx_create(int argc, char ** argv, char **str_reply) const char * l_tx_num_str = NULL; size_t l_tx_num = 0; - uint64_t value = 0; - uint64_t value_fee = 0; + uint256_t l_value = {}; + uint256_t l_value_fee = {}; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-from_wallet", &l_from_wallet_name); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-to_addr", &addr_base58_to); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-token", &l_token_ticker); @@ -3817,11 +3817,11 @@ int com_tx_create(int argc, char ** argv, char **str_reply) 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)) { - value_fee = strtoull(str_tmp, NULL, 10); + l_value_fee = dap_chain_balance_scan(str_tmp); } } if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value", &str_tmp)) { - value = strtoull(str_tmp, NULL, 10); + l_value = dap_chain_balance_scan(str_tmp); } if(!l_from_wallet_name) { dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-from_wallet'"); @@ -3831,11 +3831,11 @@ int com_tx_create(int argc, char ** argv, char **str_reply) dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-to_addr'"); return -1; } - if(!value) { + if(IS_ZERO_256(l_value)) { dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-value'"); return -1; } - if(addr_base58_fee && !value_fee) { + if(addr_base58_fee && IS_ZERO_256(l_value_fee)) { dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-value_fee' if '-fee' is specified"); return -1; @@ -3897,14 +3897,14 @@ 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, addr_to, addr_fee, - l_token_ticker, value, value_fee, l_tx_num); + 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, addr_to, addr_fee, - l_token_ticker, value, 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); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 8d465e0384bce935144bd03277f35b09c2845c81..01559c10eec8bb6dc91d4bf3971bfcbe56ea7d6d 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -273,9 +273,9 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t SubType:\n", dap_ctime_r((time_t *)&((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf), dap_chain_balance_to_coins(dap_chain_uint256_from( - ((dap_chain_tx_out_cond_t*)item)->header.value)), - ((dap_chain_tx_out_cond_t*)item)->header.value, - dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype)); + ((dap_chain_tx_out_cond_old_t*)item)->header.value)), + ((dap_chain_tx_out_cond_old_t*)item)->header.value, + dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_old_t*)item)->header.subtype)); switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash); @@ -283,35 +283,35 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t pkey: %s\n" "\t\t\t max price: %s (%"DAP_UINT64_FORMAT_U") \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_old_t*)item)->subtype.srv_pay.unit.uint32, + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.srv_uid.uint64, l_hash_str_tmp, dap_chain_balance_to_coins(dap_chain_uint256_from( - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi)), - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.unit_price_max_datoshi)), + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_pay.unit_price_max_datoshi); DAP_FREE(l_hash_str_tmp); break; 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, + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_stake.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_old_t*)item)->subtype.srv_stake.fee_addr ), - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value); + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_stake.fee_value); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: dap_string_append_printf(a_str_out, "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t net id: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t token: %s\n" "\t\t\t value: %s (%"DAP_UINT64_FORMAT_U")\n", - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.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_tx_out_cond_old_t*)item)->subtype.srv_xchange.srv_uid.uint64, + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.net_id.uint64, + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.token, dap_chain_balance_to_coins(dap_chain_uint256_from( - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value)), - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value); + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.value)), + ((dap_chain_tx_out_cond_old_t*)item)->subtype.srv_xchange.value); break; default: break; } @@ -323,23 +323,23 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t\t value: %s (%s)\n" "\t\t\t subtype: %s\n" "\t\t SubType:\n", - dap_ctime_r((time_t*)((dap_chain_256_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf), - dap_chain_balance_to_coins(((dap_chain_256_tx_out_cond_t*)item)->header.value), - dap_chain_balance_print(((dap_chain_256_tx_out_cond_t*)item)->header.value), - dap_chain_tx_out_cond_subtype_to_str(((dap_chain_256_tx_out_cond_t*)item)->header.subtype) + dap_ctime_r((time_t*)((dap_chain_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf), + dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->header.value), + dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->header.value), + dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype) ); - switch (((dap_chain_256_tx_out_cond_t*)item)->header.subtype) { + switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: - l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash); + l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash); dap_string_append_printf(a_str_out, "\t\t\t unit: 0x%08x\n" "\t\t\t uid: 0x%016"DAP_UINT64_FORMAT_x"\n" "\t\t\t pkey: %s\n" "\t\t\t max price: %s (%s) \n", - ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32, - ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.srv_uid.uint64, + ((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, l_hash_str_tmp, - dap_chain_balance_to_coins(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi), - dap_chain_balance_print(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi) + 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) ); DAP_FREE(l_hash_str_tmp); break; @@ -347,11 +347,11 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, 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_256_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64, + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64, dap_chain_addr_to_str( - &((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr + &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr ), - ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_value + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value ); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: @@ -359,11 +359,11 @@ static void 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_256_tx_out_cond_t*)item)->subtype.srv_xchange.srv_uid.uint64, - ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.net_id.uint64, - ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.token, - dap_chain_balance_to_coins(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value), - dap_chain_balance_print(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value) + ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.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), + dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value) ); break; } @@ -1021,7 +1021,6 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger switch (l_datum->header.type_id) { // token - case DAP_CHAIN_DATUM_256_TOKEN_DECL: // 256 case DAP_CHAIN_DATUM_TOKEN_DECL: { // no token necessary for addr if(a_filtr_addr_base58) { diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index aca3c351158194545b7512780b5b9913b728ea28..c8395ff5df541fba301e02648480d290b4af239a 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -423,15 +423,11 @@ dap_chain_wallet_t * dap_chain_wallet_open(const char * a_wallet_name, const cha * @param a_net_id * @return */ -uint128_t dap_chain_wallet_get_balance(dap_chain_wallet_t *a_wallet, dap_chain_net_id_t a_net_id, const char *a_token_ticker) +uint256_t dap_chain_wallet_get_balance(dap_chain_wallet_t *a_wallet, dap_chain_net_id_t a_net_id, const char *a_token_ticker) { dap_chain_net_t *l_net = dap_chain_net_by_id(a_net_id); dap_chain_addr_t *l_addr =dap_chain_wallet_get_addr(a_wallet, a_net_id); -#ifdef DAP_GLOBAL_IS_INT128 - uint128_t l_balance = 0; -#else - uint128_t l_balance = {}; -#endif + uint256_t l_balance = {}; if (l_net) { dap_ledger_t *l_ledger = l_net->pub.ledger; diff --git a/modules/wallet/include/dap_chain_wallet.h b/modules/wallet/include/dap_chain_wallet.h index f1b3e81e59162a3c0c2156e2e5f5baffb0f2bbc4..51ffd4c91ba18f5af2488f0d9855736e30211c31 100644 --- a/modules/wallet/include/dap_chain_wallet.h +++ b/modules/wallet/include/dap_chain_wallet.h @@ -58,6 +58,6 @@ size_t dap_chain_wallet_get_certs_number( dap_chain_wallet_t * a_wallet); dap_pkey_t * dap_chain_wallet_get_pkey( dap_chain_wallet_t * a_wallet,uint32_t a_key_idx); dap_enc_key_t * dap_chain_wallet_get_key( dap_chain_wallet_t * a_wallet,uint32_t a_key_idx); -uint128_t dap_chain_wallet_get_balance(dap_chain_wallet_t *a_wallet, dap_chain_net_id_t a_net_id, const char *a_token_ticker); +uint256_t dap_chain_wallet_get_balance(dap_chain_wallet_t *a_wallet, dap_chain_net_id_t a_net_id, const char *a_token_ticker); int dap_chain_wallet_save_file( dap_chain_wallet_t * a_wallet);