diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h index f3f3061f34d5d22a47d5b5595c63fa02f89265b1..946a6be6a7d73a15f754e79674d421c7779df43f 100755 --- a/dap-sdk/core/include/dap_math_ops.h +++ b/dap-sdk/core/include/dap_math_ops.h @@ -143,8 +143,7 @@ static inline bool EQUAL_256(uint256_t a_256_bit, uint256_t b_256_bit){ } static inline bool IS_ZERO_256(uint256_t a_256_bit){ - - return a_256_bit.lo == (uint128_t)0; + return EQUAL_256(a_256_bit, uint256_0);//a_256_bit.lo == (uint128_t)0; } diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index b5037d19a34ce23c7736fc7f2e7a9cfaad05e064..edda63085b9aa08e4508c50ef460ee9ffd2a5bfa 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -248,18 +248,21 @@ static dap_chain_type_t s_chain_type_from_str(const char *a_type_str) if(!dap_strcmp(a_type_str, "token")) { return CHAIN_TYPE_TOKEN; } + // if(!dap_strcmp(a_type_str, "token_256")) { + // return CHAIN_TYPE_256_TOKEN; + // } if(!dap_strcmp(a_type_str, "emission")) { return CHAIN_TYPE_EMISSION; } - if(!dap_strcmp(a_type_str, "emission_256")) { - return CHAIN_TYPE_256_EMISSION; - } + // if(!dap_strcmp(a_type_str, "emission_256")) { + // return CHAIN_TYPE_256_EMISSION; + // } if(!dap_strcmp(a_type_str, "transaction")) { return CHAIN_TYPE_TX; } - if(!dap_strcmp(a_type_str, "transaction_256")) { - return CHAIN_TYPE_256_TX; - } + // if(!dap_strcmp(a_type_str, "transaction_256")) { + // return CHAIN_TYPE_256_TX; + // } if(!dap_strcmp(a_type_str, "ca")) { return CHAIN_TYPE_CA; } @@ -274,19 +277,22 @@ 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")) { // old + // return DAP_CHAIN_DATUM_TOKEN_DECL; + // } if(!dap_strcmp(a_type_str, "token")) { - return DAP_CHAIN_DATUM_TOKEN_DECL; + return DAP_CHAIN_DATUM_256_TOKEN_DECL; } + // if(!dap_strcmp(a_type_str, "emission")) { + // return DAP_CHAIN_DATUM_TOKEN_EMISSION; + // } if(!dap_strcmp(a_type_str, "emission")) { - return DAP_CHAIN_DATUM_TOKEN_EMISSION; - } - if(!dap_strcmp(a_type_str, "emission_256")) { return DAP_CHAIN_DATUM_256_TOKEN_EMISSION; } + // if(!dap_strcmp(a_type_str, "transaction")) { + // return DAP_CHAIN_DATUM_TX; + // } if(!dap_strcmp(a_type_str, "transaction")) { - return DAP_CHAIN_DATUM_TX; - } - if(!dap_strcmp(a_type_str, "transaction_256")) { return DAP_CHAIN_DATUM_256_TX; } return DAP_CHAIN_DATUM_CUSTOM; @@ -301,15 +307,17 @@ static uint16_t s_datum_type_from_str(const char *a_type_str) static uint16_t s_chain_type_convert(dap_chain_type_t a_type) { switch (a_type) { - case CHAIN_TYPE_TOKEN: - return DAP_CHAIN_DATUM_TOKEN_DECL; + case CHAIN_TYPE_TOKEN: + // return DAP_CHAIN_DATUM_TOKEN_DECL; + // case CHAIN_TYPE_256_TOKEN: + return DAP_CHAIN_DATUM_256_TOKEN_DECL; case CHAIN_TYPE_EMISSION: - return DAP_CHAIN_DATUM_TOKEN_EMISSION; - case CHAIN_TYPE_256_EMISSION: + // return DAP_CHAIN_DATUM_TOKEN_EMISSION; + // case CHAIN_TYPE_256_EMISSION: // 256 return DAP_CHAIN_DATUM_256_TOKEN_EMISSION; case CHAIN_TYPE_TX: - return DAP_CHAIN_DATUM_TX; - case CHAIN_TYPE_256_TX: + // return DAP_CHAIN_DATUM_TX; + // case CHAIN_TYPE_256_TX: // 256 return DAP_CHAIN_DATUM_256_TX; default: return DAP_CHAIN_DATUM_CUSTOM; diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 69262d327348d8ede447d815d48bec5aa210afc0..ba54cceed23c06d607448a2840580fee99ce8e4d 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -83,8 +83,15 @@ typedef struct dap_chain_ledger_token_item { uint16_t type; dap_chain_datum_token_t * datum_token; - uint64_t total_supply; - uint64_t current_supply; + //union { + // uint64_t total_supply; + uint256_t total_supply; // 256 + //}; + // union { + // uint64_t current_supply; + uint256_t current_supply; + //}; + pthread_rwlock_t token_emissions_rwlock; dap_chain_ledger_token_emission_item_t * token_emissions; @@ -121,7 +128,7 @@ typedef struct dap_chain_ledger_tx_item { } dap_chain_ledger_tx_item_t; typedef struct dap_chain_ledger_tokenizer { - bool type_256; + // bool type_256; char token_ticker[10]; uint64_t sum; UT_hash_handle hh; @@ -144,6 +151,10 @@ typedef struct dap_chain_ledger_tx_bound { dap_chain_tx_out_t *tx_prev_out; dap_chain_tx_out_ext_t *tx_prev_out_ext; dap_chain_tx_out_cond_t *tx_prev_out_cond; + // 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; } out; dap_chain_ledger_tx_item_t *item_out; } dap_chain_ledger_tx_bound_t; @@ -384,40 +395,64 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t DAP_DELETE(l_gdb_group); l_token_item->type = a_token->type; switch(a_token->type){ - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: { - l_token_item->total_supply = a_token->header_private.total_supply;\ - 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 ); - 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); - for(uint16_t k=0; k<l_token_item->auth_signs_total;k++){ - dap_sign_get_pkey_hash(l_token_item->auth_signs[k],&l_token_item->auth_signs_pkey_hash[k]); + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: {// 256 + l_token_item->total_supply = a_token->header_private.total_supply_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 ); + 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); + for(uint16_t k=0; k<l_token_item->auth_signs_total;k++){ + dap_sign_get_pkey_hash(l_token_item->auth_signs[k],&l_token_item->auth_signs_pkey_hash[k]); + } + 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->header_private.signs_valid, a_token->header_private.signs_total); + } + break; + } + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: { + l_token_item->total_supply = GET_256_FROM_64(a_token->header_private.total_supply); + 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 ); + 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); + for(uint16_t k=0; k<l_token_item->auth_signs_total;k++){ + dap_sign_get_pkey_hash(l_token_item->auth_signs[k],&l_token_item->auth_signs_pkey_hash[k]); + } + if(s_debug_more) + log_it(L_NOTICE, "Simple token %s added (total_supply = %.1Lf total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE )", + a_token->ticker, dap_chain_datoshi_to_coins(a_token->header_private.total_supply), + a_token->header_private.signs_valid, a_token->header_private.signs_total); } + break; + } + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 if(s_debug_more) - log_it(L_NOTICE, "Simple token %s added (total_supply = %.1Lf total_signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_PRIVATE )", - a_token->ticker, dap_chain_datoshi_to_coins(a_token->header_private.total_supply), - a_token->header_private.signs_valid, a_token->header_private.signs_total); + log_it( L_NOTICE, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL ", a_token->ticker); + s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: { + if(s_debug_more) + log_it( L_NOTICE, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL ", a_token->ticker); + s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size); + break; } - break; - } - - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: { - if(s_debug_more) - log_it( L_NOTICE, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL ", a_token->ticker); - s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size); - break; - } - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: { - if(s_debug_more) - log_it( L_WARNING, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE. Not processed, wait for software update", a_token->ticker); - // TODO: Check authorithy - //s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size); - break; - } - default: - if(s_debug_more) - log_it(L_WARNING,"Unknown token declaration type 0x%04X", a_token->type ); + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + if(s_debug_more) + log_it( L_WARNING, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE. Not processed, wait for software update", a_token->ticker); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + if(s_debug_more) + log_it( L_WARNING, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE. Not processed, wait for software update", a_token->ticker); + // TODO: Check authorithy + //s_token_tsd_parse(a_ledger,l_token_item, a_token, a_token_size); + break; + default: + if(s_debug_more) + log_it(L_WARNING,"Unknown token declaration type 0x%04X", a_token->type ); } // Proc emissions tresholds s_treshold_emissions_proc( a_ledger); @@ -465,8 +500,12 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite }break; // set total supply - case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY:{ - a_token_item->total_supply = dap_tsd_get_scalar(l_tsd,uint64_t); + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256:{ // 256 + a_token_item->total_supply = dap_tsd_get_scalar(l_tsd,uint256_t); + }break; + + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY:{ // 128 + a_token_item->total_supply = GET_256_FROM_128(dap_tsd_get_scalar(l_tsd,uint128_t)); }break; // Set total signs count value to set to be valid @@ -891,23 +930,27 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) HASH_ITER(hh, PVT(a_ledger)->tokens, l_token_item, l_tmp_item) { const char *l_type_str; switch (l_token_item->type) { - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: - l_type_str = "SIMPLE"; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: - l_type_str = "PRIVATE_DECL"; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: - l_type_str = "PRIVATE_UPDATE"; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: - l_type_str = "PUBLIC"; - default: - l_type_str = "UNKNOWN"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + l_type_str = "SIMPLE"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + l_type_str = "PRIVATE_DECL"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + l_type_str = "PRIVATE_UPDATE"; break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: + l_type_str = "PUBLIC"; + default: + l_type_str = "UNKNOWN"; break; } char *l_item_str = dap_strdup_printf("Token name '%s', type %s, flags %hu\n" - "\tSupply (current/total) %"DAP_UINT64_FORMAT_U"/%"DAP_UINT64_FORMAT_U"\n" + "\tSupply (current/total) %s/%s \n" "\tAuth signs (valid/total) %zu/%zu\n" "\tTotal emissions %u\n", &l_token_item->ticker, l_type_str, l_token_item->flags, - l_token_item->current_supply, l_token_item->total_supply, + dap_chain_u256tostr(l_token_item->current_supply), dap_chain_u256tostr(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); @@ -989,11 +1032,21 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) dap_chain_ledger_token_item_t *l_token_item = DAP_NEW_Z(dap_chain_ledger_token_item_t); strncpy(l_token_item->ticker, l_objs[i].key, sizeof(l_token_item->ticker) - 1); l_token_item->ticker[sizeof(l_token_item->ticker) - 1] = '\0'; - l_token_item->datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_objs[i].value_len); - memcpy(l_token_item->datum_token, l_objs[i].value, l_objs[i].value_len); + // l_token_item->datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_objs[i].value_len); + // memcpy(l_token_item->datum_token, l_objs[i].value, l_objs[i].value_len); + size_t l_token_size = l_objs[i].value_len; + l_token_item->datum_token = dap_chain_datum_token_read(l_objs[i].value, &l_token_size); pthread_rwlock_init(&l_token_item->token_emissions_rwlock, NULL); - if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE) { - l_token_item->total_supply = l_token_item->datum_token->header_private.total_supply; + + // test tsd + // size_t signs_total = 0, signs_valid = 0, l_token_size_test = l_token_size - sizeof(dap_chain_datum_token_t) + sizeof(dap_chain_datum_token_old_t); + // dap_sign_t **sign = dap_chain_datum_token_simple_signs_parse( l_token_item->datum_token, l_token_size_test, &signs_total, &signs_valid); + // printf("---!!! dap_chain_ledger_load_cache() sign_type %d \n", ( (dap_sign_t *)sign[0])->header.type.type ); + + if (l_token_item->datum_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE) { + l_token_item->total_supply = GET_256_FROM_64(l_token_item->datum_token->header_private.total_supply); + } 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_private.total_supply_256; } HASH_ADD_STR(l_ledger_pvt->tokens, ticker, l_token_item); if (i == l_objs_count - 1) { @@ -1018,9 +1071,10 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) const char *c_token_ticker = ((dap_chain_datum_token_emission_t *)l_objs[i].value)->hdr.ticker; dap_chain_ledger_token_item_t *l_token_item = NULL; HASH_FIND_STR(l_ledger_pvt->tokens, c_token_ticker, l_token_item); - l_emission_item->datum_token_emission = l_token_item - ? dap_chain_datum_emission_read(l_objs[i].value, &l_emission_size) - : DAP_DUP_SIZE(l_objs[i].value, l_objs[i].value_len); + // l_emission_item->datum_token_emission = l_token_item + // ? dap_chain_datum_emission_read(l_objs[i].value, &l_emission_size) + // : DAP_DUP_SIZE(l_objs[i].value, l_objs[i].value_len); + l_emission_item->datum_token_emission = dap_chain_datum_emission_read(l_objs[i].value, &l_emission_size); l_emission_item->datum_token_emission_size = l_emission_size; if (l_token_item) { HASH_ADD(hh, l_token_item->token_emissions, datum_token_emission_hash, @@ -1083,14 +1137,20 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) l_objs = dap_chain_global_db_gr_load(l_gdb_group, &l_objs_count); for (size_t i = 0; i < l_objs_count; i++) { dap_ledger_wallet_balance_t *l_balance_item = DAP_NEW_Z(dap_ledger_wallet_balance_t); + size_t l_v0_size = sizeof(uint128_t); // for old data + l_balance_item->key = DAP_NEW_Z_SIZE(char, strlen(l_objs[i].key) + 1); strcpy(l_balance_item->key, l_objs[i].key); char *l_ptr = strchr(l_balance_item->key, ' '); if (l_ptr++) { strcpy(l_balance_item->token_ticker, l_ptr); } - //l_balance_item->balance = *(uint128_t *)l_objs[i].value; - l_balance_item->balance = *(uint256_t *)l_objs[i].value; + if ( l_v0_size == l_objs[i].value_len ) { // old data + l_balance_item->balance = uint256_0; + l_balance_item->balance.lo = *(uint128_t *)l_objs[i].value; + } else { + l_balance_item->balance = *(uint256_t *)l_objs[i].value; + } HASH_ADD_KEYPTR(hh, l_ledger_pvt->balance_accounts, l_balance_item->key, strlen(l_balance_item->key), l_balance_item); } @@ -1153,7 +1213,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ : &l_ledger_priv->treshold_emissions_rwlock); if(l_token_emission_item ) { if(s_debug_more) - if ( l_token_emission_item->datum_token_emission->hdr.type_value_256 ) + if ( l_token_emission_item->datum_token_emission->hdr.version == 1 ) //&& l_token_emission_item->datum_token_emission->hdr.type_256 ) log_it(L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache", dap_chain_u256tostr(l_token_emission_item->datum_token_emission->hdr.value_256), c_token_ticker, l_hash_str); else @@ -1169,6 +1229,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ size_t l_emission_size = a_token_emission_size; dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_token_emission, &l_emission_size); switch (l_emission->hdr.type){ + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH:{ dap_chain_ledger_token_item_t *l_token_item=NULL; pthread_rwlock_rdlock(&PVT(a_ledger)->tokens_rwlock); @@ -1207,7 +1268,7 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ if (l_aproves < l_aproves_valid ){ if(s_debug_more) - if ( l_emission->hdr.type_value_256 ) // 256 + if ( l_emission->hdr.version == 1 ) // && l_emission->hdr.type_256 ) // 256 log_it(L_WARNING, "Emission of %s datoshi of %s:%s is wrong: only %u valid aproves when %u need", dap_chain_u256tostr(l_emission->hdr.value_256), a_ledger->net_name, l_emission->hdr.ticker, l_aproves, l_aproves_valid ); else @@ -1291,11 +1352,11 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_ DAP_DELETE(l_gdb_group); char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_emission_item->datum_token_emission->hdr.address) ); if(s_debug_more) - if ( l_token_emission_item->datum_token_emission->hdr.type_value_256 ) // 256 - log_it(L_NOTICE, "Added token emission datum to %s: type=%s value=%.1Lf token=%s to_addr=%s ", + if ( l_token_emission_item->datum_token_emission->hdr.version == 1 ) // && l_token_emission_item->datum_token_emission->hdr.type_256 ) + log_it(L_NOTICE, "Added token emission datum to %s: type=%s value=%s token=%s to_addr=%s ", 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_datoshi_to_coins( + dap_chain_balance_to_coins( dap_chain_uint128_from_uint256(l_token_emission_item->datum_token_emission->hdr.value_256) ), c_token_ticker, l_token_emission_address_str); @@ -1315,7 +1376,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_ } else { if (l_token_item) { if(s_debug_more) - if ( ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.type_value_256 ) // 256 + if ( ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.version == 1 ) // && ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.type_256 ) // 256 log_it(L_ERROR, "Duplicate token emission datum of %s %s ( %s )", dap_chain_u256tostr(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value_256), c_token_ticker, l_hash_str); else @@ -1761,14 +1822,36 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t if (l_cond_type == TX_ITEM_TYPE_IN) { dap_chain_tx_item_type_t l_type = *(uint8_t *)l_tx_prev_out; - if ( l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT ) { + // if ( l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT ) { + // bound_item->out.tx_prev_out = l_tx_prev_out; + // memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out->addr,sizeof (bound_item->out.tx_prev_out->addr)); + // } else { + // bound_item->out.tx_prev_out_ext = l_tx_prev_out; + // memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_ext->addr,sizeof (bound_item->out.tx_prev_out_ext->addr)); + // } + + if ( l_type == TX_ITEM_TYPE_OUT ) { + l_is_type_256 = false; bound_item->out.tx_prev_out = l_tx_prev_out; - memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out->addr,sizeof (bound_item->out.tx_prev_out->addr)); - } else { + memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out->addr,sizeof (bound_item->out.tx_prev_out->addr)); + } else if ( l_type == TX_ITEM_TYPE_256_OUT ) { // 256 + l_is_type_256 = true; + bound_item->out.tx_prev_out_256 = l_tx_prev_out; + memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_256->addr,sizeof (bound_item->out.tx_prev_out_256->addr)); + } else if (l_type == TX_ITEM_TYPE_OUT_EXT ) { + l_is_type_256 = false; bound_item->out.tx_prev_out_ext = l_tx_prev_out; memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_ext->addr,sizeof (bound_item->out.tx_prev_out_ext->addr)); + } else if ( l_type == TX_ITEM_TYPE_256_OUT_EXT ) { // 256 + l_is_type_256 = true; + bound_item->out.tx_prev_out_ext_256 = l_tx_prev_out; + memcpy(&l_tx_in_from, &bound_item->out.tx_prev_out_ext_256->addr,sizeof (bound_item->out.tx_prev_out_ext_256->addr)); + } else { + l_err_num = -8; + break; } + // calculate hash of public key in current transaction dap_chain_hash_fast_t l_hash_pkey; { @@ -1784,9 +1867,24 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t dap_hash_fast(l_pkey_ser, l_pkey_ser_size, &l_hash_pkey); // hash of public key in 'out' item of previous transaction - uint8_t *l_prev_out_addr_key = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? - bound_item->out.tx_prev_out->addr.data.key : - bound_item->out.tx_prev_out_ext->addr.data.key; + // uint8_t *l_prev_out_addr_key = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? + // bound_item->out.tx_prev_out->addr.data.key : + // bound_item->out.tx_prev_out_ext->addr.data.key; + + uint8_t *l_prev_out_addr_key = NULL; + switch (l_type) { + case TX_ITEM_TYPE_256_OUT: + l_prev_out_addr_key = bound_item->out.tx_prev_out_256->addr.data.key; break; + case TX_ITEM_TYPE_OUT: + l_prev_out_addr_key = bound_item->out.tx_prev_out->addr.data.key; break; + case TX_ITEM_TYPE_256_OUT_EXT: + l_prev_out_addr_key = bound_item->out.tx_prev_out_ext_256->addr.data.key; break; + case TX_ITEM_TYPE_OUT_EXT: + l_prev_out_addr_key = bound_item->out.tx_prev_out_ext->addr.data.key; break; + default: + log_it(L_DEBUG, "Unknown item type %d", l_type); + break; + } // 4. compare public key hashes in the signature of the current transaction and in the 'out' item of the previous transaction if(memcmp(&l_hash_pkey, l_prev_out_addr_key, sizeof(dap_chain_hash_fast_t))) { @@ -1797,11 +1895,11 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t switch (l_type) { case TX_ITEM_TYPE_256_OUT: // 256 - l_value_256 = bound_item->out.tx_prev_out->header.value_256; break; + l_value_256 = bound_item->out.tx_prev_out_256->header.value; break; case TX_ITEM_TYPE_OUT: l_value = bound_item->out.tx_prev_out->header.value; break; case TX_ITEM_TYPE_256_OUT_EXT: // 256 - l_value_256 = bound_item->out.tx_prev_out_ext->header.value_256; + l_value_256 = bound_item->out.tx_prev_out_ext_256->header.value; l_token = bound_item->out.tx_prev_out_ext->token; break; case TX_ITEM_TYPE_OUT_EXT: @@ -1834,9 +1932,20 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t size_t l_pkey_ser_size = 0; const uint8_t *l_pkey_ser = dap_sign_get_pkey(l_sign, &l_pkey_ser_size); - dap_chain_tx_out_cond_t *l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; - l_is_type_256 = l_type == TX_ITEM_TYPE_256_OUT_COND ? true : false; + dap_chain_tx_out_cond_t *l_tx_prev_out_cond = NULL; + dap_chain_256_tx_out_cond_t *l_tx_prev_out_cond_256 = NULL; // 256 + + if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256 + l_is_type_256 = true; + l_tx_prev_out_cond_256 = (dap_chain_256_tx_out_cond_t *)l_tx_prev_out; + } else { + l_is_type_256 = false; + l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; + } + + // dap_chain_tx_out_cond_t *l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; + // l_is_type_256 = l_type == TX_ITEM_TYPE_256_OUT_COND ? true : false; bool l_owner = false; if (l_pkey_ser_size == l_prev_pkey_ser_size && @@ -1845,7 +1954,17 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } // 5b. Call verificator for conditional output dap_chain_ledger_verificator_t *l_verificator; - int l_tmp = (int)l_tx_prev_out_cond->header.subtype; + // int l_tmp = (int)l_tx_prev_out_cond->header.subtype; + // int l_tmp; + // if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256 + // l_tmp = (int)l_tx_prev_out_cond_256->header.subtype; + // } else { + // l_tmp = (int)l_tx_prev_out_cond->header.subtype; + // } + + int l_tmp = ( l_type == TX_ITEM_TYPE_256_OUT_COND ) ? + (int)l_tx_prev_out_cond_256->header.subtype : (int)l_tx_prev_out_cond->header.subtype; + pthread_rwlock_rdlock(&s_verificators_rwlock); HASH_FIND_INT(s_verificators, &l_tmp, l_verificator); pthread_rwlock_unlock(&s_verificators_rwlock); @@ -1860,10 +1979,12 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t break; } - bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond; + // bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond; if ( l_type == TX_ITEM_TYPE_256_OUT_COND ) { // 256 - l_value_256 = l_tx_prev_out_cond->header.value_256; + bound_item->out.tx_prev_out_cond_256 = l_tx_prev_out_cond; + l_value_256 = l_tx_prev_out_cond_256->header.value; } else { + bound_item->out.tx_prev_out_cond = l_tx_prev_out_cond; l_value = l_tx_prev_out_cond->header.value; } l_token = NULL; @@ -1915,6 +2036,21 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } } + // HASH_FIND_STR(l_values_from_prev_tx, l_token, l_value_cur); + // if (!l_value_cur) { + // l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t); + // strcpy(l_value_cur->token_ticker, l_token); + // HASH_ADD_STR(l_values_from_prev_tx, token_ticker, l_value_cur); + + // if ( l_is_type_256 ) { // 256 + // l_value_cur->type_256 = true; + // SUM_256_256(l_value_cur->sum_256, l_value_256, &l_value_cur->sum_256); + // }else { + // l_value_cur->type_256 = false; + // l_value_cur->sum += l_value; + // } + // } + if ( l_is_type_256 ) { // 256 HASH_FIND_STR(l_values_from_prev_tx_256, l_token, l_value_cur_256); if (!l_value_cur_256) { @@ -1997,13 +2133,13 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } else if (l_type == TX_ITEM_TYPE_256_OUT) { // 256 l_is_type_256 = true; - dap_chain_tx_out_t *l_tx_out = (dap_chain_tx_out_t *)l_list_tmp->data; + dap_chain_256_tx_out_t *l_tx_out = (dap_chain_256_tx_out_t *)l_list_tmp->data; if (l_multichannel) { // token ticker is mandatory for multichannel transactions l_err_num = -16; break; } if (emission_flag) { - l_value_256 = l_tx_out->header.value_256; + l_value_256 = l_tx_out->header.value; } memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to)); l_list_tx_out = dap_list_append(l_list_tx_out, l_tx_out); @@ -2024,13 +2160,13 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } else if (l_type == TX_ITEM_TYPE_256_OUT_EXT) { // 256 l_is_type_256 = true; - dap_chain_tx_out_ext_t *l_tx_out = (dap_chain_tx_out_ext_t *)l_list_tmp->data; + dap_chain_256_tx_out_ext_t *l_tx_out = (dap_chain_256_tx_out_ext_t *)l_list_tmp->data; if (!l_multichannel) { // token ticker is depricated for single-channel transactions l_err_num = -16; break; } if (emission_flag) { - l_value_256 = l_tx_out->header.value_256; + l_value_256 = l_tx_out->header.value; l_token = l_tx_out->token; } memcpy(&l_tx_out_to , &l_tx_out->addr, sizeof (l_tx_out_to)); @@ -2051,9 +2187,9 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t } else if (l_type == TX_ITEM_TYPE_256_OUT_COND) { // 256 l_is_type_256 = true; - dap_chain_tx_out_cond_t *l_tx_out = (dap_chain_tx_out_cond_t *)l_list_tmp->data; + dap_chain_256_tx_out_cond_t *l_tx_out = (dap_chain_256_tx_out_cond_t *)l_list_tmp->data; if (emission_flag) { - l_value_256 = l_tx_out->header.value_256; + l_value_256 = l_tx_out->header.value; } if (l_multichannel) { // out_cond have no field .token log_it(L_WARNING, "No conditional output support for multichannel transaction"); @@ -2371,10 +2507,18 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_ledger_tx_item_t *l_prev_item_out = bound_item->item_out; - l_ticker_trl = *l_prev_item_out->cache_data.token_tiker - ? dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker) - : dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token); + // l_ticker_trl = *l_prev_item_out->cache_data.token_tiker + // ? dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker) + // : dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token); + if ( *l_prev_item_out->cache_data.token_tiker ) + l_ticker_trl = dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker); + else if ( l_out_type == TX_ITEM_TYPE_256_OUT || l_out_type == TX_ITEM_TYPE_256_OUT_EXT ) // 256 + l_ticker_trl = dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext_256->token); + else + l_ticker_trl = dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token); + + if (!l_multichannel && l_ticker_old_trl && strcmp(l_token_ticker, l_token_ticker_old)) { l_multichannel = true; } @@ -2385,14 +2529,22 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_tx_in_t *l_tx_in = bound_item->in.tx_cur_in; dap_ledger_wallet_balance_t *wallet_balance = NULL; //void *l_item_out = *(void **)&bound_item->out; - //dap_chain_tx_item_type_t l_out_type = *(uint8_t *)l_item_out; - - //dap_chain_addr_t *l_addr = NULL; uint256_t l_value = uint256_0; - dap_chain_addr_t *l_addr = (l_out_type == TX_ITEM_TYPE_OUT || l_out_type == TX_ITEM_TYPE_256_OUT) ? - &bound_item->out.tx_prev_out->addr : - &bound_item->out.tx_prev_out_ext->addr; + dap_chain_addr_t *l_addr = NULL; + switch (l_out_type) { + case TX_ITEM_TYPE_256_OUT: l_addr = &bound_item->out.tx_prev_out_256->addr; break; + case TX_ITEM_TYPE_OUT: l_addr = &bound_item->out.tx_prev_out->addr; break; + case TX_ITEM_TYPE_256_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext_256->addr; break; + case TX_ITEM_TYPE_OUT_EXT: l_addr = &bound_item->out.tx_prev_out_ext->addr; break; + default: + log_it(L_DEBUG, "Unknown item type %d", l_type); + break; + } + + // dap_chain_addr_t *l_addr = (l_out_type == TX_ITEM_TYPE_OUT || l_out_type == TX_ITEM_TYPE_256_OUT) ? + // &bound_item->out.tx_prev_out->addr : + // &bound_item->out.tx_prev_out_ext->addr; char *l_addr_str = dap_chain_addr_to_str(l_addr); char *l_wallet_balance_key = dap_strjoin(" ", l_addr_str, l_token_ticker, (char*)NULL); @@ -2401,9 +2553,9 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, pthread_rwlock_unlock(&PVT(a_ledger)->balance_accounts_rwlock); if (wallet_balance) { switch (l_out_type) { - case TX_ITEM_TYPE_256_OUT: l_value = bound_item->out.tx_prev_out->header.value_256; break; + case TX_ITEM_TYPE_256_OUT: l_value = bound_item->out.tx_prev_out_256->header.value; break; case TX_ITEM_TYPE_OUT: l_value = GET_256_FROM_64(bound_item->out.tx_prev_out->header.value); break; - case TX_ITEM_TYPE_256_OUT_EXT: l_value = bound_item->out.tx_prev_out_ext->header.value_256; break; + case TX_ITEM_TYPE_256_OUT_EXT: l_value = bound_item->out.tx_prev_out_ext_256->header.value; break; case TX_ITEM_TYPE_OUT_EXT: l_value = GET_256_FROM_64(bound_item->out.tx_prev_out_ext->header.value); break; default: log_it(L_DEBUG, "Unknown item type %d", l_type); @@ -2521,22 +2673,34 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, } dap_chain_tx_out_t *l_out_item = NULL; + dap_chain_256_tx_out_t *l_out_item_256 = NULL; dap_chain_tx_out_ext_t *l_out_item_ext = NULL; + dap_chain_256_tx_out_ext_t *l_out_item_ext_256 = NULL; + switch (l_type) { - case TX_ITEM_TYPE_256_OUT: l_out_item = (dap_chain_tx_out_t *)l_tx_out->data; break; + case TX_ITEM_TYPE_256_OUT: l_out_item_256 = (dap_chain_256_tx_out_t *)l_tx_out->data; break; case TX_ITEM_TYPE_OUT: l_out_item = (dap_chain_tx_out_t *)l_tx_out->data; break; - case TX_ITEM_TYPE_256_OUT_EXT: l_out_item_ext = (dap_chain_tx_out_ext_t *)l_tx_out->data; break; + case TX_ITEM_TYPE_256_OUT_EXT: l_out_item_ext_256 = (dap_chain_256_tx_out_ext_t *)l_tx_out->data; break; case TX_ITEM_TYPE_OUT_EXT: l_out_item_ext = (dap_chain_tx_out_ext_t *)l_tx_out->data; break; default: log_it(L_DEBUG, "Unknown item type %d", l_type); break; } - if ((l_out_item || l_out_item_ext) && l_ticker_trl) { - dap_chain_addr_t *l_addr = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? - &l_out_item->addr : - &l_out_item_ext->addr; - + if ((l_out_item||l_out_item_ext||l_out_item_256||l_out_item_ext_256) && l_ticker_trl) { + // dap_chain_addr_t *l_addr = (l_type == TX_ITEM_TYPE_OUT || l_type == TX_ITEM_TYPE_256_OUT) ? + // &l_out_item->addr : + // &l_out_item_ext->addr; + dap_chain_addr_t *l_addr; + switch (l_type) { + case TX_ITEM_TYPE_256_OUT: l_addr = &l_out_item_256->addr; break; + case TX_ITEM_TYPE_OUT: l_addr = &l_out_item->addr; break; + case TX_ITEM_TYPE_256_OUT_EXT: l_addr = &l_out_item_ext_256->addr; break; + case TX_ITEM_TYPE_OUT_EXT: l_addr = &l_out_item_ext->addr; break; + default: + log_it(L_DEBUG, "Unknown item type %d", l_type); + break; + } char *l_addr_str = dap_chain_addr_to_str(l_addr); //log_it (L_DEBUG, "Check unspent %.03Lf %s for addr %s", @@ -2551,9 +2715,9 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, uint64_t l_value = 0; uint256_t l_value_256 = uint256_0; switch (l_type) { - case TX_ITEM_TYPE_256_OUT: l_value_256 = l_out_item->header.value_256; break; // _256 + case TX_ITEM_TYPE_256_OUT: l_value_256 = l_out_item_256->header.value; break; // _256 case TX_ITEM_TYPE_OUT: l_value_256 = GET_256_FROM_64(l_out_item->header.value); break; - case TX_ITEM_TYPE_256_OUT_EXT: l_value_256 = l_out_item_ext->header.value_256; break; // _256 + case TX_ITEM_TYPE_256_OUT_EXT: l_value_256 = l_out_item_ext_256->header.value; break; // _256 case TX_ITEM_TYPE_OUT_EXT: l_value_256 = GET_256_FROM_64(l_out_item_ext->header.value); break; default: log_it(L_DEBUG, "Unknown item type %d", l_type); @@ -2972,8 +3136,8 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c } } if (l_type == TX_ITEM_TYPE_256_OUT) { // 256 - //const dap_chain_256_tx_out_t *l_tx_out = (const dap_chain_256_tx_out_t*) l_list_tmp->data; - const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; + const dap_chain_256_tx_out_t *l_tx_out = (const dap_chain_256_tx_out_t*) l_list_tmp->data; + // const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; // Check for token name if (!strcmp(a_token_ticker, l_iter_current->cache_data.token_tiker)) { // if transaction has the out item with requested addr @@ -2981,7 +3145,7 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c // if 'out' item not used & transaction is valid if(!dap_chain_ledger_item_is_used_out(l_iter_current, l_out_idx_tmp) && dap_chain_datum_tx_verify_sign(l_cur_tx)) { - SUM_256_256(balance, l_tx_out->header.value_256, &balance); + SUM_256_256(balance, l_tx_out->header.value, &balance); } } } @@ -3002,8 +3166,8 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c } } if (l_type == TX_ITEM_TYPE_256_OUT_EXT) { // 256 - // const dap_chain_256_tx_out_ext_t *l_tx_out = (const dap_chain_256_tx_out_ext_t*) l_list_tmp->data; - const dap_chain_tx_out_ext_t *l_tx_out = (const dap_chain_tx_out_ext_t*) l_list_tmp->data; + const dap_chain_256_tx_out_ext_t *l_tx_out = (const dap_chain_256_tx_out_ext_t*) l_list_tmp->data; + // const dap_chain_tx_out_ext_t *l_tx_out = (const dap_chain_tx_out_ext_t*) l_list_tmp->data; // Check for token name if (!strcmp(a_token_ticker, l_tx_out->token)) { // if transaction has the out item with requested addr @@ -3011,7 +3175,7 @@ uint256_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c // if 'out' item not used & transaction is valid if(!dap_chain_ledger_item_is_used_out(l_iter_current, l_out_idx_tmp) && dap_chain_datum_tx_verify_sign(l_cur_tx)) { - SUM_256_256(balance, l_tx_out->header.value_256, &balance); + SUM_256_256(balance, l_tx_out->header.value, &balance); } } } @@ -3301,11 +3465,11 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c l_value = GET_256_FROM_64(l_out->header.value); } break; case TX_ITEM_TYPE_256_OUT: { - dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; - if ( IS_ZERO_256(l_out->header.value_256) || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { + dap_chain_256_tx_out_t *l_out = (dap_chain_256_tx_out_t *)l_list_tmp->data; + if ( IS_ZERO_256(l_out->header.value) || memcmp(a_addr_from, &l_out->addr, sizeof(dap_chain_addr_t))) { continue; } - l_value = l_out->header.value_256; + l_value = l_out->header.value; } break; case TX_ITEM_TYPE_OUT_EXT: { dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; @@ -3316,12 +3480,12 @@ dap_list_t *dap_chain_ledger_get_list_tx_outs_with_val(dap_ledger_t *a_ledger, c l_value = GET_256_FROM_64(l_out_ext->header.value); } break; case TX_ITEM_TYPE_256_OUT_EXT: { - dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; - if ( IS_ZERO_256(l_out_ext->header.value_256) || memcmp(a_addr_from, &l_out_ext->addr, sizeof(dap_chain_addr_t)) || + 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)) || strcmp((char *)a_token_ticker, l_out_ext->token)) { continue; } - l_value = l_out_ext->header.value_256; + l_value = l_out_ext->header.value; } break; } // if (l_type == TX_ITEM_TYPE_OUT) { diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 8f655b747d01d5031eedace2baa99f1b2f16673b..6925d627291f1202e534e3f0040bdb36412dec0a 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -88,16 +88,17 @@ typedef size_t (*dap_chain_callback_add_datums_with_group_t)(dap_chain_t * , dap typedef void (*dap_chain_callback_notify_t)(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void* a_atom, size_t a_atom_size); //change in chain happened -typedef enum dap_chain_type +typedef enum dap_chain_type { CHAIN_TYPE_FIRST, CHAIN_TYPE_TOKEN, CHAIN_TYPE_EMISSION, - CHAIN_TYPE_256_EMISSION, // 256 CHAIN_TYPE_TX, - CHAIN_TYPE_256_TX, // 256 CHAIN_TYPE_CA, CHAIN_TYPE_LAST + // CHAIN_TYPE_256_TOKEN, // 256 + // CHAIN_TYPE_256_EMISSION, // 256 + // CHAIN_TYPE_256_TX, // 256 } dap_chain_type_t; typedef struct dap_chain{ diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 140a22e8cdb33b3751d7e5251c4b34d5e6fc924a..dd1da5ab30a840b70b5420351882fb55520b175d 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -34,7 +34,13 @@ const char *c_dap_chain_datum_token_emission_type_str[]={ [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH] = "AUTH", [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO] = "ALGO", [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER] = "OWNER", - [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT] = "SMART_CONTRACT", + [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT] = "SMART_CONTRACT" +// 256 types + // [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED] = "UNDEFINED", + // [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH] = "AUTH", + // [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO] = "ALGO", + // [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER] = "OWNER", + // [DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT] = "SMART_CONTRACT" }; const char *c_dap_chain_datum_token_flag_str[] = { @@ -67,10 +73,12 @@ 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: + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: l_tsd_size = a_token->header_private_decl.tsd_total_size; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: l_tsd_size = a_token->header_private_update.tsd_total_size; break; default: return NULL; @@ -101,6 +109,56 @@ dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size } } +dap_chain_datum_token_t *dap_chain_datum_token_read(byte_t *a_token_serial, size_t *a_token_size) { + + uint16_t l_token_type = ((dap_chain_datum_token_t *)a_token_serial)->type; + if ( dap_chain_datum_token_is_old(l_token_type) ) { + dap_chain_datum_token_old_t * l_token_old = DAP_NEW_Z_SIZE(dap_chain_datum_token_old_t, (*a_token_size)); + memcpy(l_token_old, a_token_serial, (*a_token_size)); + size_t l_token_size = (*a_token_size) - sizeof(*l_token_old) + sizeof(dap_chain_datum_token_t); + dap_chain_datum_token_t * l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + strncpy(l_token->ticker, l_token_old->ticker, sizeof(l_token_old->ticker) ); + size_t l_token_tsd_size = (*a_token_size) - sizeof(*l_token_old); + memcpy(l_token->data_n_tsd, l_token_old->data_n_tsd, l_token_tsd_size); + + switch( l_token_type ){ + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: { + l_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256 + l_token->header_private.total_supply_256 = GET_256_FROM_64(l_token_old->header_private.total_supply); + l_token->header_private.signs_valid = l_token_old->header_private.signs_valid; + l_token->header_private.signs_total = l_token_old->header_private.signs_total; + break; + } + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + l_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; // 256 + l_token->header_private_decl.flags = l_token_old->header_private_decl.flags; + l_token->header_private_decl.tsd_total_size = l_token_old->header_private_decl.tsd_total_size; + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + l_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; // 256 + l_token->header_private_update.padding = l_token_old->header_private_update.padding; + l_token->header_private_update.tsd_total_size = l_token_old->header_private_update.tsd_total_size; + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: + l_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC; // 256 + l_token->header_public.total_supply_256 = GET_256_FROM_128(l_token_old->header_public.total_supply); + l_token->header_public.premine_supply_256 = GET_256_FROM_128(l_token_old->header_public.premine_supply); + memcpy(&l_token->header_public.premine_address, &l_token_old->header_public.premine_address, sizeof(l_token_old->header_public.premine_address)); + break; + default: + DAP_DELETE(l_token_old); + return NULL; + } + DAP_DELETE(l_token_old); + return l_token; + } else { + dap_chain_datum_token_t * l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, (*a_token_size)); + memcpy(l_token, a_token_serial, (*a_token_size)); + return l_token; + } + return NULL; +} + /** * @brief dap_chain_datum_token_flags_dump * @param a_str_out @@ -177,6 +235,7 @@ dap_sign_t ** dap_chain_datum_token_simple_signs_parse(dap_chain_datum_token_t * *a_signs_valid = a_datum_token->header_private.signs_valid; size_t l_offset = 0; uint16_t n = 0; + 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); size_t l_sign_size = dap_sign_get_size(l_sign); @@ -212,26 +271,31 @@ size_t dap_chain_datum_emission_get_size(uint8_t *a_emission_serial) l_ret = sizeof(l_emission->hdr); } switch (l_emission->hdr.type) { - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: { - uint16_t l_sign_count = *(uint16_t *)(a_emission_serial + l_ret); - l_ret += sizeof(l_emission->data.type_auth); - for (uint16_t i = 0; i < l_sign_count; i++) { - dap_sign_t *l_sign = (dap_sign_t *)(a_emission_serial + l_ret); - l_ret += dap_sign_get_size(l_sign); - } - } break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: - l_ret += sizeof(l_emission->data.type_algo); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: - l_ret += sizeof(l_emission->data.type_atom_owner); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: - l_ret += sizeof(l_emission->data.type_presale); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: - default: - break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: { + uint16_t l_sign_count = *(uint16_t *)(a_emission_serial + l_ret); + l_ret += sizeof(l_emission->data.type_auth); + for (uint16_t i = 0; i < l_sign_count; i++) { + dap_sign_t *l_sign = (dap_sign_t *)(a_emission_serial + l_ret); + l_ret += dap_sign_get_size(l_sign); + } + } break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: + l_ret += sizeof(l_emission->data.type_algo); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + l_ret += sizeof(l_emission->data.type_atom_owner); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: + l_ret += sizeof(l_emission->data.type_presale); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + default: + break; } return l_ret; } @@ -247,13 +311,38 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emissi size_t l_add_size = sizeof(l_emission->hdr) - l_old_hdr_size; l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size + l_add_size); l_emission->hdr.version = 1; + // l_emission->hdr.type_256 = false; memcpy(l_emission, a_emission_serial, l_old_hdr_size); memcpy((byte_t *)l_emission + sizeof(l_emission->hdr), a_emission_serial + l_old_hdr_size, l_emission_size - l_old_hdr_size); l_emission_size += l_add_size; (*a_emission_size) = l_emission_size; - } else + } else { l_emission = DAP_DUP_SIZE(a_emission_serial, (*a_emission_size)); + } return l_emission; } + +// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE 0x0001 +// Extended declaration of privatetoken with in-time control +// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL 0x0002 +// Token update +// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE 0x0003 +// Open token with now ownership +// #define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC 0x0004 + +// 256 TYPE +bool dap_chain_datum_token_is_old(uint8_t a_type) { + switch(a_type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: + return true; + default: + return false; + } +} + + diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 7c91336dfcea560008144827508c0f777504426c..7cb301e07ef4e52224811c88d729e213e4b10a9b 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -182,7 +182,7 @@ int dap_chain_datum_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain // 256 int dap_chain_datum_256_tx_add_out_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value) { - dap_chain_tx_out_t *l_tx_out = dap_chain_datum_tx_item_256_out_create(a_addr, a_value); + dap_chain_256_tx_out_t *l_tx_out = dap_chain_datum_tx_item_256_out_create(a_addr, a_value); if(l_tx_out) { dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out); DAP_DELETE(l_tx_out); @@ -210,7 +210,7 @@ int dap_chain_datum_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_c // 256 int dap_chain_datum_256_tx_add_out_ext_item(dap_chain_datum_tx_t **a_tx, const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token) { - dap_chain_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_256_out_ext_create(a_addr, a_value, a_token); + dap_chain_256_tx_out_ext_t *l_tx_out = dap_chain_datum_tx_item_256_out_ext_create(a_addr, a_value, a_token); if(l_tx_out) { dap_chain_datum_tx_add_item(a_tx, (const uint8_t *)l_tx_out); DAP_DELETE(l_tx_out); @@ -240,7 +240,7 @@ int dap_chain_datum_tx_add_out_cond_item(dap_chain_datum_tx_t **a_tx, dap_enc_ke int dap_chain_datum_256_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_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_256_out_cond_create_srv_pay( + dap_chain_256_tx_out_cond_t *l_tx_out = dap_chain_datum_tx_item_256_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 5648eb92cff4a4b2c54ff49e6c0865487e5f812d..59b64a3aeec1a30a13928e545a209f7de3d69820 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -58,6 +58,13 @@ static size_t dap_chain_tx_out_get_size(const dap_chain_tx_out_t *a_item) return size; } +// 256 +static size_t dap_chain_256_tx_out_get_size(const dap_chain_256_tx_out_t *a_item) +{ + (void) a_item; + size_t size = sizeof(dap_chain_256_tx_out_t); + return size; +} static size_t dap_chain_tx_out_ext_get_size(const dap_chain_tx_out_ext_t *a_item) { @@ -66,12 +73,26 @@ static size_t dap_chain_tx_out_ext_get_size(const dap_chain_tx_out_ext_t *a_item return size; } +// 256 +static size_t dap_chain_256_tx_out_ext_get_size(const dap_chain_256_tx_out_ext_t *a_item) +{ + (void) a_item; + size_t size = sizeof(dap_chain_256_tx_out_ext_t); + return size; +} static size_t dap_chain_tx_out_cond_get_size(const dap_chain_tx_out_cond_t *a_item) { 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; @@ -120,13 +141,13 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_t *a_item) size = dap_chain_tx_out_get_size((const dap_chain_tx_out_t*) a_item); break; case TX_ITEM_TYPE_256_OUT: // 256 - size = dap_chain_tx_out_get_size((const dap_chain_tx_out_t*) a_item); + size = dap_chain_256_tx_out_get_size((const dap_chain_256_tx_out_t*) a_item); break; case TX_ITEM_TYPE_OUT_EXT: size = dap_chain_tx_out_ext_get_size((const dap_chain_tx_out_ext_t*) a_item); break; case TX_ITEM_TYPE_256_OUT_EXT: // 256 - size = dap_chain_tx_out_ext_get_size((const dap_chain_tx_out_ext_t*) a_item); + size = dap_chain_256_tx_out_ext_get_size((const dap_chain_256_tx_out_ext_t*) a_item); break; case TX_ITEM_TYPE_RECEIPT: // Receipt size = dap_chain_datum_tx_receipt_get_size((const dap_chain_datum_tx_receipt_t*) a_item); @@ -141,7 +162,7 @@ size_t dap_chain_datum_item_tx_get_size(const uint8_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_256_OUT_COND: // 256 - size = dap_chain_tx_out_cond_get_size((const dap_chain_tx_out_cond_t*) a_item); + size = dap_chain_256_tx_out_cond_get_size((const dap_chain_256_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); @@ -241,13 +262,13 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a } //256 -dap_chain_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value) +dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value) { if(!a_addr) return NULL; - dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t); + dap_chain_256_tx_out_t *l_item = DAP_NEW_Z(dap_chain_256_tx_out_t); l_item->header.type = TX_ITEM_TYPE_256_OUT; - l_item->header.value_256 = a_value; + l_item->header.value = a_value; memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t)); return l_item; } @@ -265,13 +286,13 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a } //256 -dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token) +dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token) { if (!a_addr || !a_token) return NULL; - dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_tx_out_ext_t); + dap_chain_256_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_256_tx_out_ext_t); l_item->header.type = TX_ITEM_TYPE_256_OUT_EXT; - l_item->header.value_256 = a_value; + l_item->header.value = a_value; memcpy(&l_item->addr, a_addr, sizeof(dap_chain_addr_t)); strcpy(l_item->token, a_token); return l_item; @@ -310,7 +331,7 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc } // 256 -dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_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) { @@ -320,16 +341,16 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_256_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_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); + 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); if(l_item == NULL) return NULL; l_item->header.item_type = TX_ITEM_TYPE_256_OUT_COND; - l_item->header.value_256 = a_value; + l_item->header.value = a_value; l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY; // By default creatre cond for service pay. Rework with smth more flexible l_item->subtype.srv_pay.srv_uid = a_srv_uid; l_item->subtype.srv_pay.unit = a_unit; - l_item->subtype.srv_pay.unit_price_max_datoshi_256 = a_value_max_per_unit; + l_item->subtype.srv_pay.unit_price_max_datoshi = a_value_max_per_unit; dap_hash_fast( l_pub_key, l_pub_key_size, & l_item->subtype.srv_pay.pkey_hash); l_item->params_size = (uint32_t)a_params_size; memcpy(l_item->params, a_params, a_params_size); @@ -360,16 +381,16 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap } // 256 -dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_256_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_net_id, +dap_chain_256_tx_out_cond_t *dap_chain_datum_tx_item_256_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_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); + 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); l_item->header.item_type = TX_ITEM_TYPE_256_OUT_COND; - l_item->header.value_256 = a_value; + 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->subtype.srv_xchange.net_id = a_net_id; @@ -401,13 +422,13 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c } // 256 -dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_256_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_256_tx_out_cond_t *dap_chain_datum_tx_item_256_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_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); + 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); l_item->header.item_type = TX_ITEM_TYPE_256_OUT_COND; - l_item->header.value_256 = a_value; + 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->subtype.srv_stake.fee_value = a_fee_value; @@ -548,11 +569,11 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a } // 256 -dap_chain_tx_out_cond_t *dap_chain_datum_256_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) { 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_tx_out_cond_t *l_res = NULL; + 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; diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h index 8723dda037d328b86487321e48b054934919786d..3ccaaf44e17095818053103ef450859feab6cbca 100644 --- a/modules/common/include/dap_chain_datum.h +++ b/modules/common/include/dap_chain_datum.h @@ -37,9 +37,7 @@ /// Transaction header section #define DAP_CHAIN_DATUM_TX 0x0100 - -// 256 -#define DAP_CHAIN_DATUM_256_TX 0x0101 +#define DAP_CHAIN_DATUM_256_TX 0x0101 // 256 /// Transaction request section #define DAP_CHAIN_DATUM_TX_REQUEST 0x0300 @@ -61,6 +59,7 @@ /// 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_256_TOKEN_EMISSION 0xf101 // 256 #define DAP_CHAIN_DATUM_TOKEN_DISMISSAL 0xf200 @@ -89,6 +88,8 @@ 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;\ case DAP_CHAIN_DATUM_256_TOKEN_EMISSION:\ diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 20a75ba505103de2803f510f891aab6254136deb..53939e98082797f9f3514dd14a77aa359875a4b3 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -31,6 +31,36 @@ #include "dap_tsd.h" #include "dap_strfuncs.h" + +// Token declaration +typedef struct dap_chain_datum_token_old { + uint16_t type; + char ticker[DAP_CHAIN_TICKER_SIZE_MAX]; + union { + struct { + uint64_t total_supply; + uint16_t signs_valid; + uint16_t signs_total; + } DAP_ALIGN_PACKED header_private; + struct { + uint16_t flags; + size_t tsd_total_size; + } DAP_ALIGN_PACKED header_private_decl; + struct { + uint16_t padding; + size_t tsd_total_size; + } DAP_ALIGN_PACKED header_private_update; + struct { + uint128_t total_supply; + uint128_t premine_supply; + dap_chain_addr_t premine_address; + uint32_t flags; + } DAP_ALIGN_PACKED header_public; + }; + byte_t data_n_tsd[]; +} DAP_ALIGN_PACKED dap_chain_datum_token_old_t; + + // Token declaration typedef struct dap_chain_datum_token{ uint16_t type; @@ -38,7 +68,10 @@ typedef struct dap_chain_datum_token{ union { // Simple private token declaration. Useful for 100% premined emission without any plays with token and owners after that struct { - uint64_t total_supply; // Could be zero if unlimited + union { + uint64_t total_supply; // Could be zero if unlimited + uint256_t total_supply_256; + }; uint16_t signs_valid; // Emission auth signs uint16_t signs_total; // Emission auth signs } DAP_ALIGN_PACKED header_private; @@ -54,8 +87,14 @@ typedef struct dap_chain_datum_token{ } DAP_ALIGN_PACKED header_private_update; // Public token declaration struct { - uint128_t total_supply; - uint128_t premine_supply; + union { + uint128_t total_supply; + uint256_t total_supply_256; + }; + union { + uint128_t premine_supply; + uint256_t premine_supply_256; + }; dap_chain_addr_t premine_address; uint32_t flags; } DAP_ALIGN_PACKED header_public; @@ -65,13 +104,23 @@ typedef struct dap_chain_datum_token{ // Token declaration type // Simple private token decl -#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE 0x0001 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE 0x0001 // Extended declaration of privatetoken with in-time control -#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL 0x0002 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL 0x0002 // Token update -#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE 0x0003 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE 0x0003 // Open token with now ownership -#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC 0x0004 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC 0x0004 + +// 256 +// Simple private token decl +#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 +// Token update +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE 0x0007 +// Open token with now ownership +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC 0x0008 // Macros for token flags @@ -147,7 +196,8 @@ static inline uint16_t dap_chain_datum_token_flag_from_str(const char* a_str) #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS 0x0002 // Total supply limits -#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY 0x0003 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY 0x0003 // 128 +#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256 0x0026 // 256 // Set total signs count value to set to be valid #define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID 0x0004 @@ -210,7 +260,6 @@ typedef struct dap_chain_datum_token_emission{ struct { uint8_t version; uint8_t type; // Emission Type - bool type_value_256; char ticker[DAP_CHAIN_TICKER_SIZE_MAX]; dap_chain_addr_t address; // Emission holder's address union { @@ -218,6 +267,7 @@ typedef struct dap_chain_datum_token_emission{ uint256_t value_256; }; uint8_t nonce[DAP_CHAIN_DATUM_NONCE_SIZE]; + // bool type_256; // emission 256 } DAP_ALIGN_PACKED hdr; union { struct { @@ -248,14 +298,22 @@ typedef struct dap_chain_datum_token_emission{ #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO 0x02 #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER 0x03 #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT 0x04 +// 256 +// #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED 0x05 +// #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH 0x06 +// #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO 0x07 +// #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER 0x08 +// #define DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT 0x09 extern const char *c_dap_chain_datum_token_emission_type_str[]; /// TDS op funcs -/// - dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t * a_token, size_t a_token_size); void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags); void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_data_n_tsd, size_t a_certs_size); dap_sign_t ** dap_chain_datum_token_simple_signs_parse(dap_chain_datum_token_t * a_datum_token, size_t a_datum_token_size, size_t *a_signs_count, size_t * a_signs_valid); +dap_chain_datum_token_t *dap_chain_datum_token_read(byte_t *a_token_serial, size_t *a_token_size); dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emission_serial, size_t *a_emission_size); size_t dap_chain_datum_emission_get_size(uint8_t *a_emission_serial); + +// 256 TYPE +bool dap_chain_datum_token_is_old(uint8_t a_type); diff --git a/modules/common/include/dap_chain_datum_tx_items.h b/modules/common/include/dap_chain_datum_tx_items.h index d5425f70b3085f4b5ef00f5f2bf99f8e65ff15ab..216577aaa75a3bc8307ab9bee6f91d8f10957888 100644 --- a/modules/common/include/dap_chain_datum_tx_items.h +++ b/modules/common/include/dap_chain_datum_tx_items.h @@ -59,7 +59,9 @@ DAP_STATIC_INLINE const char * dap_chain_datum_tx_item_type_to_str(dap_chain_tx_ case TX_ITEM_TYPE_PKEY: return "TX_ITEM_TYPE_PKEY"; case TX_ITEM_TYPE_SIG: return "TX_ITEM_TYPE_SIG"; case TX_ITEM_TYPE_TOKEN: return "TX_ITEM_TYPE_TOKEN"; + case TX_ITEM_TYPE_256_TOKEN: return "TX_ITEM_TYPE_256_TOKEN"; // 256 case TX_ITEM_TYPE_TOKEN_EXT: return "TX_ITEM_TYPE_TOKEN_EXT"; + case TX_ITEM_TYPE_256_TOKEN_EXT: return "TX_ITEM_TYPE_256_TOKEN_EXT"; // 256 case TX_ITEM_TYPE_IN_COND: return "TX_ITEM_TYPE_IN_COND"; case TX_ITEM_TYPE_OUT_COND: return "TX_ITEM_TYPE_OUT_COND"; case TX_ITEM_TYPE_256_OUT_COND: return "TX_ITEM_TYPE_256_OUT_COND"; // 256 @@ -107,7 +109,7 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a_addr, uint64_t a_value); // 256 -dap_chain_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value); +dap_chain_256_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_t *a_addr, uint256_t a_value); /** * Create item dap_chain_tx_out_ext_t @@ -117,7 +119,7 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_256_out_create(const dap_chain_addr_ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint64_t a_value, const char *a_token); // 256 -dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_256_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token); +dap_chain_256_tx_out_ext_t* dap_chain_datum_tx_item_256_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 @@ -128,7 +130,7 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_enc uint64_t a_value, uint64_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); // 256 -dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_pay(dap_enc_key_t *a_key, dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_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_cond, size_t a_cond_size); /** @@ -140,7 +142,7 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap dap_chain_net_id_t a_net_id, const char *a_token, uint64_t a_value, const void *a_params, uint32_t a_params_size); //256 -dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_256_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, +dap_chain_256_tx_out_cond_t* dap_chain_datum_tx_item_256_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); @@ -154,7 +156,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c dap_chain_addr_t *a_fee_addr, dap_chain_addr_t *a_hldr_addr, const void *a_params, uint32_t a_params_size); // 256 -dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_256_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_256_tx_out_cond_t *dap_chain_datum_tx_item_256_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); /** @@ -187,4 +189,4 @@ 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_tx_out_cond_t *dap_chain_datum_256_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.h b/modules/common/include/dap_chain_datum_tx_out.h index 37c18c0e5429e298f8404837594f431d65b24652..0394a74ef6ef244c51aec5852a61f34735d3790e 100644 --- a/modules/common/include/dap_chain_datum_tx_out.h +++ b/modules/common/include/dap_chain_datum_tx_out.h @@ -35,11 +35,17 @@ typedef struct dap_chain_tx_out{ struct { dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type - union { - uint64_t value; /// @param value @brief Number of Datoshis ( DAP/10^9 ) to be transfered - uint256_t value_256; - }; + uint64_t value; /// @param value @brief Number of Datoshis ( DAP/10^9 ) to be transfered } header; /// Only header's hash is used for verification dap_chain_addr_t addr; //// } DAP_ALIGN_PACKED dap_chain_tx_out_t; +//256 +typedef struct dap_chain_256_tx_out{ + struct { + dap_chain_tx_item_type_t type:8; /// @param type @brief Transaction item type + uint256_t value; /// @param value @brief Number of Datoshis ( DAP/10^9 ) to be transfered + } header; /// Only header's hash is used for verification + dap_chain_addr_t addr; //// +} DAP_ALIGN_PACKED dap_chain_256_tx_out_t; + 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 e90701767a1172caf75fb9fe86e62908519fa099..1bbd166f0a7f75bd9318382833e3d34733b56ba7 100644 --- a/modules/common/include/dap_chain_datum_tx_out_cond.h +++ b/modules/common/include/dap_chain_datum_tx_out_cond.h @@ -57,10 +57,7 @@ typedef struct dap_chain_tx_out_cond { /// Condition subtype dap_chain_tx_out_cond_subtype_t subtype : 8; /// Number of Datoshis ( DAP/10^9 ) to be reserver for service - union { - uint64_t value; - uint256_t value_256; - }; + uint64_t value; /// When time expires this output could be used only by transaction owner dap_chain_time_t ts_expires; } header; @@ -74,10 +71,7 @@ typedef struct dap_chain_tx_out_cond { /// Price unit thats used to check price max dap_chain_net_srv_price_unit_uid_t unit; /// Maximum price per unit - union { - uint64_t unit_price_max_datoshi; - uint256_t unit_price_max_datoshi_256; - }; + uint64_t unit_price_max_datoshi; } srv_pay; struct { // Service uid that only could be used for this outout @@ -87,10 +81,7 @@ typedef struct dap_chain_tx_out_cond { // Chain network to change to dap_chain_net_id_t net_id; // Total amount of datoshi to change to - union { - uint64_t value; - uint256_t value_256; - }; + uint64_t value; } srv_xchange; struct { // Service uid that only could be used for this outout @@ -106,3 +97,60 @@ typedef struct dap_chain_tx_out_cond { 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; + + +/** + * @struct dap_chain_tx_out + * @brief Transaction item out_cond + */ +typedef struct dap_chain_256_tx_out_cond { + struct { + /// Transaction item type + dap_chain_tx_item_type_t item_type :8; + /// Condition subtype + dap_chain_tx_out_cond_subtype_t subtype : 8; + /// Number of Datoshis ( DAP/10^9 ) to be reserver for service + uint256_t value; + /// When time expires this output could be used only by transaction owner + dap_chain_time_t ts_expires; + } header; + union { + /// Structure with specific for service pay condition subtype + struct { + /// Public key hash that could use this conditioned outout + dap_chain_hash_fast_t pkey_hash; + /// Service uid that only could be used for this outout + dap_chain_net_srv_uid_t srv_uid; + /// 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; + } srv_pay; + struct { + // Service uid that only could be used for this outout + dap_chain_net_srv_uid_t srv_uid; + // Token ticker to change to + char token[DAP_CHAIN_TICKER_SIZE_MAX]; + // Chain network to change to + dap_chain_net_id_t net_id; + // Total amount of datoshi to change to + uint256_t value; + } srv_xchange; + struct { + // Service uid that only could be used for this outout + dap_chain_net_srv_uid_t srv_uid; + // Stake holder address + dap_chain_addr_t hldr_addr; + // Fee address + dap_chain_addr_t fee_addr; + // Fee value in percent + long double fee_value; + } srv_stake; + } 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; + + + + diff --git a/modules/common/include/dap_chain_datum_tx_out_ext.h b/modules/common/include/dap_chain_datum_tx_out_ext.h index 400a61f68f9285df84f449c2c592ff80dd769de9..1a310068cb2a0b20160e76798b1ccc214dd49662 100644 --- a/modules/common/include/dap_chain_datum_tx_out_ext.h +++ b/modules/common/include/dap_chain_datum_tx_out_ext.h @@ -36,11 +36,18 @@ typedef struct dap_chain_tx_out_ext{ struct { dap_chain_tx_item_type_t type : 8; // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT - union { - uint64_t value; // Number of Datoshis ( DAP/10^9 ) to be transfered - uint256_t value_256; - }; + uint64_t value; // Number of Datoshis ( DAP/10^9 ) to be transfered } header; // Only header's hash is used for verification dap_chain_addr_t addr; // Address to transfer to char token[DAP_CHAIN_TICKER_SIZE_MAX]; // Which token is transferred } DAP_ALIGN_PACKED dap_chain_tx_out_ext_t; + +// 256 +typedef struct dap_chain_256_tx_out_ext{ + struct { + dap_chain_tx_item_type_t type : 8; // Transaction item type - should be TX_ITEM_TYPE_OUT_EXT + uint256_t value; // Number of Datoshis ( DAP/10^9 ) to be transfered + } header; // Only header's hash is used for verification + dap_chain_addr_t addr; // Address to transfer to + char token[DAP_CHAIN_TICKER_SIZE_MAX]; // Which token is transferred +} DAP_ALIGN_PACKED dap_chain_256_tx_out_ext_t; diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 823eb9cf4a62199378dc38e1b7e35f959e14f2d0..415910ef4d43c9b4cb2e4f153d464d3d13cec7c3 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -343,6 +343,7 @@ 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:{ dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; if (dap_chain_ledger_token_load(a_chain->ledger,l_token, l_datum->header.data_size)) @@ -350,10 +351,10 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha }break; case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data; - l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? - true : false; - if (dap_chain_ledger_token_emission_load(a_chain->ledger, l_token_em, l_datum->header.data_size)) + // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data; + // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? + // true : false; + if (dap_chain_ledger_token_emission_load(a_chain->ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size)) return ATOM_REJECT; }break; case DAP_CHAIN_DATUM_256_TX: // 256 diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 72db2cd695485b871241849554b5d18c13e83a3a..ac3dbf15c4ef6ae3f5a052ae48b077c7fcdcb362 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2548,16 +2548,17 @@ int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t 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, (dap_chain_datum_token_t*) a_datum->data ); case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) a_datum->data; - l_token_em->hdr.type_value_256 = a_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? - true : false; - return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, l_token_em, a_datum->header.data_size ); + // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) a_datum->data; + // l_token_em->hdr.type_value_256 = a_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? + // true : false; + return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, (dap_chain_datum_token_emission_t*) a_datum->data, a_datum->header.data_size ); } default: return 0; } @@ -2579,6 +2580,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da return; } switch (a_datum->header.type_id){ + case DAP_CHAIN_DATUM_256_TOKEN_DECL: case DAP_CHAIN_DATUM_TOKEN_DECL:{ dap_chain_datum_token_t * l_token = (dap_chain_datum_token_t*) a_datum->data; size_t l_token_size = a_datum->header.data_size; @@ -2591,12 +2593,18 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_string_append_printf(a_str_out, "ticker: %s\n", l_token->ticker); dap_string_append_printf(a_str_out, "size: %zd\n", l_token_size); switch (l_token->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ dap_string_append_printf(a_str_out, "type: SIMPLE\n"); dap_string_append_printf(a_str_out, "sign_total: %hu\n", l_token->header_private.signs_total ); dap_string_append_printf(a_str_out, "sign_valid: %hu\n", l_token->header_private.signs_valid ); - dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply ); + if ( dap_chain_datum_token_is_old(l_token->type) ) + dap_string_append_printf(a_str_out, "total_supply: %"DAP_UINT64_FORMAT_U"\n", l_token->header_private.total_supply ); + else + dap_string_append_printf(a_str_out, "total_supply: %s\n", + dap_chain_u256tostr(l_token->header_private.total_supply_256)); }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ dap_string_append_printf(a_str_out,"type: PRIVATE_UPDATE\n"); dap_tsd_t * l_tsd = dap_chain_datum_token_tsd_get(l_token, l_token_size); @@ -2622,9 +2630,15 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_chain_datum_token_flags_dump(a_str_out, dap_tsd_get_scalar(l_tsd, uint16_t)); break; - case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: // 256 + dap_string_append_printf(a_str_out,"total_supply: %s\n", + dap_chain_u256tostr( + dap_tsd_get_scalar(l_tsd, uint256_t))); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: // 128 dap_string_append_printf(a_str_out,"total_supply: %s\n", - dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t))); + dap_chain_balance_print( + dap_tsd_get_scalar(l_tsd, uint128_t))); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : dap_string_append_printf(a_str_out,"total_signs_valid: %u\n", @@ -2709,6 +2723,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da } } }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{ dap_string_append_printf(a_str_out,"type: PRIVATE_DECL\n"); dap_string_append_printf(a_str_out,"flags: "); @@ -2727,9 +2742,15 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da return; } switch( l_tsd->type){ - case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: // 256 dap_string_append_printf(a_str_out,"total_supply: %s\n", - dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t))); + dap_chain_u256tostr( + dap_tsd_get_scalar(l_tsd, uint256_t))); + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: // 128 + dap_string_append_printf(a_str_out,"total_supply: %s\n", + dap_chain_balance_print( + dap_tsd_get_scalar(l_tsd, uint128_t))); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : dap_string_append_printf(a_str_out,"total_signs_valid: %u\n", @@ -2769,6 +2790,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_decl.tsd_total_size; dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd, l_certs_field_size); }break; + case DAP_CHAIN_DATUM_256_TX: case DAP_CHAIN_DATUM_TX:{ dap_chain_datum_tx_t * l_tx =(dap_chain_datum_tx_t *) a_datum->data; char buf[50]; @@ -2794,27 +2816,40 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str, sizeof (l_tx_prev_hash_str)-1); dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str ); } break; - case TX_ITEM_TYPE_256_OUT: // 256 + case TX_ITEM_TYPE_256_OUT: { // 256 + dap_string_append_printf(a_str_out,"\tvalue: %s\n", + dap_chain_u256tostr(((dap_chain_256_tx_out_t *)l_cur->data)->header.value) + ); + char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_t *)l_cur->data)->addr ); + dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); + DAP_DELETE(l_addr_str); + } break; case TX_ITEM_TYPE_OUT:{ - dap_chain_tx_out_t * l_out = l_cur->data; - if ( l_item_type == TX_ITEM_TYPE_256_OUT ) // u256_t value - dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_u256tostr(l_out->header.value_256) ); - else // u64_t value - dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out->header.value ); - char * l_addr_str = dap_chain_addr_to_str(&l_out->addr); + dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", + ((dap_chain_tx_out_t *)l_cur->data)->header.value + ); + char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_tx_out_t *)l_cur->data)->addr ); + dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); + DAP_DELETE(l_addr_str); + } break; + case TX_ITEM_TYPE_256_OUT_EXT: { // 256 + // dap_chain_256_tx_out_ext_t * l_out_ext = l_cur->data; + dap_string_append_printf(a_str_out,"\tvalue: %s\n", + dap_chain_u256tostr(((dap_chain_256_tx_out_ext_t *)l_cur->data)->header.value) + ); + char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_256_tx_out_ext_t *)l_cur->data)->addr ); dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); + dap_string_append_printf(a_str_out,"\ttoken : %s\n", ((dap_chain_256_tx_out_ext_t *)l_cur->data)->token ); DAP_DELETE(l_addr_str); } break; - case TX_ITEM_TYPE_256_OUT_EXT: // 256 case TX_ITEM_TYPE_OUT_EXT:{ - dap_chain_tx_out_ext_t * l_out_ext = l_cur->data; - if ( l_item_type == TX_ITEM_TYPE_256_OUT_EXT ) // u256_t value - dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_u256tostr(l_out_ext->header.value_256) ); - else - dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out_ext->header.value ); - char * l_addr_str = dap_chain_addr_to_str(&l_out_ext->addr); + // dap_chain_tx_out_ext_t * l_out_ext = l_cur->data; + dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", + ((dap_chain_tx_out_ext_t *)l_cur->data)->header.value + ); + char * l_addr_str = dap_chain_addr_to_str( &((dap_chain_tx_out_ext_t *)l_cur->data)->addr ); dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str ); - dap_string_append_printf(a_str_out,"\ttoken : %s\n", l_out_ext->token ); + dap_string_append_printf(a_str_out,"\ttoken : %s\n", ((dap_chain_tx_out_ext_t *)l_cur->data)->token ); DAP_DELETE(l_addr_str); } break; case TX_ITEM_TYPE_SIG:{ @@ -2859,13 +2894,44 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1); 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 + case TX_ITEM_TYPE_256_OUT_COND: { // 256 + dap_chain_256_tx_out_cond_t * l_out = l_cur->data; + dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_u256tostr(l_out->header.value) ); + 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 ); + 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; + case SERV_UNIT_SEC: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_SEC\n"); break; + case SERV_UNIT_DAY: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_DAY\n"); break; + case SERV_UNIT_KB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_KB\n"); break; + case SERV_UNIT_B : dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_B\n"); break; + default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break; + } + dap_string_append_printf(a_str_out,"\tunit_price_max: %s\n", + dap_chain_u256tostr(l_out->subtype.srv_pay.unit_price_max_datoshi) + ); + char l_pkey_hash_str[70]={[0]='\0'}; + dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1); + dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_pkey_hash_str ); + }break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:{ + dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE\n"); + }break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:{ + dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE\n"); + }break; + default:{ + dap_string_append_printf(a_str_out,"\tsubtype: UNKNOWN\n"); + }break; + } + 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; - if ( l_item_type == TX_ITEM_TYPE_256_OUT_COND ) // u256_t value - dap_string_append_printf(a_str_out,"\tvalue: %s\n", dap_chain_u256tostr(l_out->header.value_256) ); - else - dap_string_append_printf(a_str_out,"\tvalue: %"DAP_UINT64_FORMAT_U"\n", l_out->header.value ); + 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:{ dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n"); @@ -2879,11 +2945,10 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da case SERV_UNIT_B : dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_B\n"); break; default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break; } - if ( l_item_type == TX_ITEM_TYPE_256_OUT_COND ) // u256_t value - dap_string_append_printf(a_str_out,"\tunit_price_max: %s\n", dap_chain_u256tostr(l_out->subtype.srv_pay.unit_price_max_datoshi_256)); - else - dap_string_append_printf(a_str_out,"\tunit_price_max: %"DAP_UINT64_FORMAT_U"\n", l_out->subtype.srv_pay.unit_price_max_datoshi); - + dap_string_append_printf(a_str_out,"\tunit_price_max: %"DAP_UINT64_FORMAT_U"\n", + l_out->subtype.srv_pay.unit_price_max_datoshi + ); + char l_pkey_hash_str[70]={[0]='\0'}; dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1); dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_pkey_hash_str ); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 0ca0fb95cd7a2d6169450e685a9932fcd1ca8669..75e348ad4ef6424351e4790cf25de256a8574429 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -1798,6 +1798,7 @@ int com_tx_wallet(int argc, char ** argv, char **str_reply) dap_string_append_printf(l_string_ret, "balance:\n"); else dap_string_append_printf(l_string_ret, "balance: 0"); + for(size_t i = 0; i < l_addr_tokens_size; i++) { if(l_addr_tokens[i]) { // uint128_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]); @@ -2457,7 +2458,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) int l_arg_index = 1; const char * l_type_str = NULL; - uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; + uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; // 256 const char * l_ticker = NULL; @@ -2492,7 +2493,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) l_arg_index=dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-type", &l_type_str); if (!l_type_str || !strcmp(l_type_str, "private")) { - l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; + l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; // 256 } else { dap_chain_node_cli_set_reply_text(a_str_reply, "token_update can't accept type \"%s\"", l_type_str); return -22; @@ -2502,7 +2503,8 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) size_t l_datum_data_offset = 0; switch(l_type){ - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ // 256 dap_list_t *l_tsd_list = dap_list_alloc(); size_t l_tsd_total_size = 0; l_arg_index++; @@ -2523,7 +2525,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) } // Add flags as set_flags TDS section dap_tsd_t * l_tsd = dap_tsd_create_scalar( - DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS, l_flags); + DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS, l_flags); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_tsd_size( l_tsd); @@ -2554,9 +2556,16 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) return -10; } } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply - uint128_t l_param_value = dap_chain_balance_scan(l_arg_param); - dap_tsd_t * l_tsd = dap_tsd_create_scalar( - DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); + dap_tsd_t * l_tsd; + if ( dap_chain_datum_token_is_old(l_type) ) { // 128 + uint128_t l_param_value = dap_chain_balance_scan(l_arg_param); + l_tsd = dap_tsd_create_scalar( + DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); + } else { // 256 + uint256_t l_param_value = GET_256_FROM_128(dap_chain_balance_scan(l_arg_param)); + l_tsd = dap_tsd_create_scalar( + DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value); + } dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_tsd_size( l_tsd); }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid @@ -2645,7 +2654,7 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) // Create new datum token l_datum_token_update = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)+l_tsd_total_size ) ; - l_datum_token_update->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; + l_datum_token_update->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; // 256 dap_snprintf(l_datum_token_update->ticker, sizeof(l_datum_token_update->ticker), "%s", l_ticker); l_datum_token_update->header_private_update.tsd_total_size = l_tsd_total_size; @@ -2773,12 +2782,11 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) int l_arg_index = 1; const char * l_type_str = NULL; - uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; const char * l_ticker = NULL; const char * l_total_supply_str = NULL; - uint64_t l_total_supply = 0; + uint256_t l_total_supply = uint256_0; // 256 const char * l_signs_emission_str = NULL; uint16_t l_signs_emission = 0; @@ -2794,6 +2802,13 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; + // 256 + bool l_type_256 = true; //dap_chain_node_cli_check_option(a_argv, l_arg_index, a_argc, "-256") == -1 ? false : true; + + uint16_t l_type = l_type_256 + ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256 + : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE; + const char * l_hash_out_type = NULL; dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-H", &l_hash_out_type); if(!l_hash_out_type) @@ -2825,11 +2840,14 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) if (l_type_str) { if (strcmp( l_type_str, "private") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; + l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL // 256 + : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL; }else if (strcmp( l_type_str, "private_simple") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; + l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256 + : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE; }else if (strcmp( l_type_str, "public_simple") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC; + l_type = l_type_256 ? DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC // 256 + : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC; } } @@ -2837,7 +2855,8 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) size_t l_datum_data_offset = 0; switch(l_type){ - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{ + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: { dap_list_t *l_tsd_list = dap_list_alloc(); size_t l_tsd_total_size = 0; uint16_t l_flags = 0; @@ -2857,9 +2876,16 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) l_str_flags++; } } else if ( strcmp( a_argv[l_arg_index],"-total_supply" )==0){ // Total supply - uint128_t l_param_value = dap_chain_balance_scan(l_arg_param); - dap_tsd_t * l_tsd = dap_tsd_create_scalar( - DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); + dap_tsd_t * l_tsd; + if ( l_type == DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL ) { // 256 + uint256_t l_param_value = GET_256_FROM_128(dap_chain_balance_scan(l_arg_param)); + l_tsd = dap_tsd_create_scalar( + DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256, l_param_value); + } else { // 128 + uint128_t l_param_value = dap_chain_balance_scan(l_arg_param); + l_tsd = dap_tsd_create_scalar( + DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); + } dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_tsd_size( l_tsd); }else if ( strcmp( a_argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid @@ -2921,7 +2947,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) log_it(L_DEBUG,"Prepeared TSD sections on %zd total size", l_tsd_total_size); // Create new datum token l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)+l_tsd_total_size ) ; - l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; + + l_datum_token->type = l_type; //DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; + dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); l_datum_token->header_private_decl.flags = l_flags; log_it(L_DEBUG,"Token declaration '%s' initialized", l_datum_token->ticker); @@ -2949,8 +2977,16 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) continue; } switch (l_tsd->type){ - case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: { - char *l_balance = dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t)); + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_256: { // 256 + char *l_balance; + l_balance = dap_chain_u256tostr(dap_tsd_get_scalar(l_tsd, uint256_t)); + log_it(L_DEBUG,"== TOTAL_SUPPLY: %s", l_balance); + DAP_DELETE(l_balance); + } + break; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: { // 128 + char *l_balance; + l_balance = dap_chain_balance_print(dap_tsd_get_scalar(l_tsd, uint128_t)); log_it(L_DEBUG,"== TOTAL_SUPPLY: %s", l_balance); DAP_DELETE(l_balance); } @@ -2989,7 +3025,8 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) }break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: { // Total supply value dap_chain_node_cli_find_option_val(a_argv, l_arg_index, a_argc, "-total_supply", &l_total_supply_str); @@ -3008,8 +3045,10 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-total_supply'"); return -3; } else { - char * l_tmp = NULL; - if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) { + // char * l_tmp = NULL; + l_total_supply = GET_256_FROM_128(dap_chain_balance_scan(l_total_supply_str)); + //if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) { + if ( IS_ZERO_256(l_total_supply) ) { dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter '-total_supply' to be unsigned integer value that fits in 8 bytes"); return -4; @@ -3064,9 +3103,14 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) // Create new datum token l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)); - l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; + l_datum_token->type = l_type_256 + ? DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE // 256 + : DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE; dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); - l_datum_token->header_private.total_supply = l_total_supply; + if ( l_type_256 ) + l_datum_token->header_private.total_supply_256 = l_total_supply; + else + l_datum_token->header_private.total_supply = dap_chain_uint256_to(l_total_supply); l_datum_token->header_private.signs_total = l_signs_total; l_datum_token->header_private.signs_valid = l_signs_emission; @@ -3090,8 +3134,13 @@ 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_TOKEN_DECL, l_datum_token, - sizeof(*l_datum_token) + l_datum_data_offset); + dap_chain_datum_t * l_datum = l_type_256 + ? dap_chain_datum_create( // 256 + DAP_CHAIN_DATUM_256_TOKEN_DECL, + l_datum_token, sizeof(*l_datum_token) + l_datum_data_offset) + : 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); // Calc datum's hash @@ -3110,14 +3159,15 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) } int l_ret = 0; + char * l_datum_type = l_type_256 ? "256_t" : ""; if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { if(!dap_strcmp(l_hash_out_type,"hex")) - dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, l_ticker); + dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s %s with token %s is placed in datum pool ", l_datum_type, l_key_str, l_ticker); else - dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str_base58, l_ticker); + dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s %s with token %s is placed in datum pool ", l_datum_type, l_key_str_base58, l_ticker); } else { - dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str_base58); + dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s %s is not placed in datum pool ", l_datum_type, l_key_str_base58); DAP_DELETE(l_datum); l_ret = -2; } @@ -3146,7 +3196,7 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) const char * l_addr_str = NULL; const char * l_emission_hash_str = NULL; - const char * l_type_256 = NULL; + bool l_type_256 = true; // false; char * l_emission_hash_str_new = NULL; dap_chain_hash_fast_t l_emission_hash={0}; @@ -3190,7 +3240,8 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-emission", &l_emission_hash_str); // 256 - dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-256", &l_type_256); + // dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-256", &l_type_256); + //l_type_256 = dap_chain_node_cli_check_option(a_argv, arg_index, a_argc, "-256") == -1 ? false : true; // Emission certs dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-certs", &l_certs_str); @@ -3308,17 +3359,20 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size); if ( !l_type_256 ) { - l_emission->hdr.type_value_256 = false; + // l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH; + // l_emission->hdr.type_256 = false; l_emission->hdr.value = dap_chain_uint256_to(l_emission_value); } else { // 256 - l_emission->hdr.type_value_256 = true; + // l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH; + // l_emission->hdr.type_256 = true; l_emission->hdr.value_256 = l_emission_value; } + l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH; l_emission->hdr.version = 1; strncpy(l_emission->hdr.ticker, l_ticker, sizeof(l_emission->hdr.ticker) - 1); - l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH; + // l_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH; memcpy(&l_emission->hdr.address, l_addr, sizeof(l_emission->hdr.address)); time_t l_time = time(NULL); @@ -3371,15 +3425,23 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) if(dap_chain_global_db_gr_set(dap_strdup(l_emission_hash_str_new), (uint8_t *) l_datum_emission, l_datum_emission_size , l_gdb_group_mempool_emission)) { if(!dap_strcmp(l_hash_out_type,"hex")) - str_reply_tmp = dap_strdup_printf("Datum emission %s is placed in datum pool", l_emission_hash_str_new); + str_reply_tmp = dap_strdup_printf("Datum%s emission %s is placed in datum pool", + (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""), + l_emission_hash_str_new); else - str_reply_tmp = dap_strdup_printf("Datum emission %s is placed in datum pool", l_emission_hash_str_base58); + str_reply_tmp = dap_strdup_printf("Datum%s emission %s is placed in datum pool", + (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""), + l_emission_hash_str_base58); } else { if(!dap_strcmp(l_hash_out_type,"hex")) - dap_chain_node_cli_set_reply_text(a_str_reply, "Datum emission %s is not placed in datum pool", l_emission_hash_str_new); + dap_chain_node_cli_set_reply_text(a_str_reply, "Datum%s emission %s is not placed in datum pool", + (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""), + l_emission_hash_str_new); else - dap_chain_node_cli_set_reply_text(a_str_reply, "Datum emission %s is not placed in datum pool", l_emission_hash_str_base58); + dap_chain_node_cli_set_reply_text(a_str_reply, "Datum%s emission %s is not placed in datum pool", + (l_datum_emission->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? " 256_t" : ""), + l_emission_hash_str_base58); DAP_DEL_Z(l_emission_hash_str_new); l_emission_hash_str = NULL; DAP_DEL_Z(l_emission_hash_str_base58); @@ -3466,16 +3528,28 @@ int com_token_emit(int a_argc, char ** a_argv, char ** a_str_reply) if(dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_datum_tx, l_datum_tx_size , l_gdb_group_mempool_base_tx)) { if(!dap_strcmp(l_hash_out_type,"hex")) - dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, l_tx_hash_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is placed in datum pool ", + str_reply_tmp, + (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""), + l_tx_hash_str); else - dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum tx %s is placed in datum pool ", str_reply_tmp, l_tx_hash_str_base58); + dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is placed in datum pool ", + str_reply_tmp, + (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""), + l_tx_hash_str_base58); DAP_DEL_Z(l_tx_hash_str); DAP_DEL_Z(l_tx_hash_str_base58); } else { if(!dap_strcmp(l_hash_out_type,"hex")) - dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, l_emission_hash_str); + dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is not placed in datum pool ", + str_reply_tmp, + (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""), + l_emission_hash_str); else - dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp, l_tx_hash_str_base58); + dap_chain_node_cli_set_reply_text(a_str_reply, "%s\ndatum%s tx %s is not placed in datum pool ", + str_reply_tmp, + (l_datum_tx->header.type_id == DAP_CHAIN_DATUM_256_TX ? " 256_t" : ""), + l_tx_hash_str_base58); DAP_DEL_Z(l_tx_hash_str); DAP_DEL_Z(l_tx_hash_str_base58); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index bd5d2b66ac00eef7c4256fd55eb725c046967e1d..7fb56397a1f65f2911732a3eb67ff22b72b94d63 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -167,10 +167,10 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t Value: %s (%s)\n" "\t\t Address: %s\n", dap_chain_balance_to_coins(dap_chain_uint128_from_uint256( - ((dap_chain_tx_out_t*)item)->header.value_256) + ((dap_chain_256_tx_out_t*)item)->header.value) ), - dap_chain_u256tostr(((dap_chain_tx_out_t*)item)->header.value_256), - dap_chain_addr_to_str(&((dap_chain_tx_out_t*)item)->addr)); + dap_chain_u256tostr(((dap_chain_256_tx_out_t*)item)->header.value), + dap_chain_addr_to_str(&((dap_chain_256_tx_out_t*)item)->addr)); break; } case TX_ITEM_TYPE_256_TOKEN: @@ -374,27 +374,27 @@ 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_tx_out_cond_t*)item)->header.ts_expires, l_tmp_buf), + 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_uint128_from_uint256(((dap_chain_tx_out_cond_t*)item)->header.value_256) + dap_chain_uint128_from_uint256(((dap_chain_256_tx_out_cond_t*)item)->header.value) ), - dap_chain_u256tostr(((dap_chain_tx_out_cond_t*)item)->header.value_256), - dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype) + dap_chain_u256tostr(((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) ); - switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { + switch (((dap_chain_256_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); + l_hash_str_tmp = dap_chain_hash_fast_to_str_new(&((dap_chain_256_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_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_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, l_hash_str_tmp, dap_chain_balance_to_coins(dap_chain_uint128_from_uint256( - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi_256) + ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi) ), - dap_chain_u256tostr(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi_256) + dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi) ); DAP_FREE(l_hash_str_tmp); break; @@ -402,11 +402,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_tx_out_cond_t*)item)->subtype.srv_stake.srv_uid.uint64, + ((dap_chain_256_tx_out_cond_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_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_addr ), - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake.fee_value + ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_stake.fee_value ); break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: @@ -414,15 +414,15 @@ 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_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_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_uint128_from_uint256( - ((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value_256 + ((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value ) ), - dap_chain_u256tostr(((dap_chain_tx_out_cond_t*)item)->subtype.srv_xchange.value_256) + dap_chain_u256tostr(((dap_chain_256_tx_out_cond_t*)item)->subtype.srv_xchange.value) ); break; } @@ -445,12 +445,12 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, "\t\t Addr: %s\n" "\t\t Token: %s\n" "\t\t Value: %s (%s)\n", - dap_chain_addr_to_str(&((dap_chain_tx_out_ext_t*)item)->addr), - ((dap_chain_tx_out_ext_t*)item)->token, + dap_chain_addr_to_str(&((dap_chain_256_tx_out_ext_t*)item)->addr), + ((dap_chain_256_tx_out_ext_t*)item)->token, dap_chain_balance_to_coins(dap_chain_uint128_from_uint256( - ((dap_chain_tx_out_ext_t*)item)->header.value_256) + ((dap_chain_256_tx_out_ext_t*)item)->header.value) ), - dap_chain_u256tostr(((dap_chain_tx_out_ext_t*)item)->header.value_256) + dap_chain_u256tostr(((dap_chain_256_tx_out_ext_t*)item)->header.value) ); break; default: @@ -553,24 +553,24 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); dap_list_t *l_list_tmp = l_list_out_items; + while(l_list_tmp) { - // const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; + const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; // save OUT item l_tx_out - only for first OUT item - if(!l_tx_data) - { + if(!l_tx_data) { // save tx hash l_tx_data = DAP_NEW_Z(dap_tx_data_t); dap_chain_hash_fast_t l_tx_hash; dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); memcpy(&l_tx_data->tx_hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); - // if ( l_type_256 ) // 256 - // memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); - // else - memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); - + if ( l_type_256 ) // 256 + memcpy(&l_tx_data->addr, &l_tx_out->addr, sizeof(dap_chain_addr_t)); + else + memcpy(&l_tx_data->addr, &l_tx_out_256->addr, sizeof(dap_chain_addr_t)); + dap_chain_hash_fast_to_str(&l_tx_data->tx_hash, l_tx_data->tx_hash_str, sizeof(l_tx_data->tx_hash_str)); //l_tx_data->pos_num = l_count; @@ -582,7 +582,6 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, dap_chain_tx_token_t *tk = l_list_tx_token->data; memcpy(l_tx_data->token_ticker, tk->header.ticker, sizeof(l_tx_data->token_ticker)); } - // take token from prev out item else { // find IN items @@ -616,6 +615,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, } l_list_tmp = dap_list_next(l_list_tmp); } + if(l_list_out_items) dap_list_free(l_list_out_items); @@ -644,21 +644,22 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, else l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT, NULL); l_list_tmp = l_list_out_items; + while(l_list_tmp) { - // const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; + const dap_chain_256_tx_out_t *l_tx_out_256 = (const dap_chain_256_tx_out_t*) l_list_tmp->data; const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; //dap_tx_data_t *l_tx_data_prev = NULL; const char *l_token_str = NULL; if(l_tx_data) l_token_str = l_tx_data->token_ticker; - char *l_dst_to_str = - (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL; + char *l_dst_to_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : + (l_tx_out_256) ? dap_chain_addr_to_str(&l_tx_out_256->addr) : NULL; - if(l_tx_out) { + if(l_tx_out || l_tx_out_256) { if ( l_type_256 ) // 256 dap_string_append_printf(l_str_out, " OUT 256_t item %s %s to %s\n", - dap_chain_u256tostr(l_tx_out->header.value_256), + dap_chain_u256tostr(l_tx_out_256->header.value), dap_strlen(l_token_str) > 0 ? l_token_str : "?", l_dst_to_str ? l_dst_to_str : "?" ); @@ -672,6 +673,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, DAP_DELETE(l_dst_to_str); l_list_tmp = dap_list_next(l_list_tmp); } + // find all IN items in transaction dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN, NULL); l_list_tmp = l_list_in_items; @@ -684,6 +686,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, if(!dap_hash_fast_is_blank(&tx_prev_hash)){ tx_hash_base58_str = dap_enc_base58_from_hex_str_to_str( l_tx_data->tx_hash_str); dap_chain_hash_fast_to_str(&tx_prev_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); + } else{ strcpy(l_tx_hash_str, "Null"); @@ -695,6 +698,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, dap_string_append_printf(l_str_out, " IN item \n prev tx_hash %s\n", tx_hash_base58_str); DAP_DELETE(tx_hash_base58_str); + //find prev OUT item dap_tx_data_t *l_tx_data_prev = NULL; HASH_FIND(hh, l_tx_data_hash, &tx_prev_hash, sizeof(dap_chain_hash_fast_t), l_tx_data_prev); @@ -711,22 +715,21 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, // find OUT item for IN item; dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, l_tx_in->header.tx_out_prev_idx); - dap_chain_tx_out_t *l_tx_prev_out = - l_list_out_prev_item ? (dap_chain_tx_out_t*)l_list_out_prev_item->data : - NULL; + dap_chain_256_tx_out_t *l_tx_prev_out = + l_list_out_prev_item ? (dap_chain_256_tx_out_t*)l_list_out_prev_item->data : NULL; // print value from prev out item dap_string_append_printf(l_str_out, " prev OUT 256_t item value=%s", - l_tx_prev_out ? dap_chain_u256tostr(l_tx_prev_out->header.value_256) : "0"); + l_tx_prev_out ? dap_chain_u256tostr(l_tx_prev_out->header.value) : "0"); } else { dap_list_t *l_list_out_prev_items = dap_chain_datum_tx_items_get(l_tx_prev, TX_ITEM_TYPE_OUT, NULL); dap_list_t *l_list_out_prev_item = dap_list_nth(l_list_out_prev_items, l_tx_in->header.tx_out_prev_idx); dap_chain_tx_out_t *l_tx_prev_out = - l_list_out_prev_item ? (dap_chain_tx_out_t*)l_list_out_prev_item->data : - NULL; + l_list_out_prev_item ? (dap_chain_tx_out_t*)l_list_out_prev_item->data : NULL; dap_string_append_printf(l_str_out, " prev OUT item value=%"DAP_UINT64_FORMAT_U, - l_tx_prev_out ? l_tx_prev_out->header.value : 0); + l_tx_prev_out ? l_tx_prev_out->header.value : 0); + } } dap_string_append_printf(l_str_out, "\n"); @@ -1211,40 +1214,60 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke dap_string_append(l_str_out, "\n"); dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); switch (l_token->type) { - // Simple private token decl - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", - dap_chain_datoshi_to_coins(l_token->header_private.total_supply), - l_token->header_private.total_supply, - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", - l_token->header_private_decl.tsd_total_size, - l_token->header_private_decl.flags); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", - l_token->header_private_update.tsd_total_size, - l_token->header_private_update.padding); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { - char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); - char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); - dap_string_append_printf(l_str_out, - " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - dap_chain_datoshi_to_coins(l_token->header_public.total_supply), - dap_chain_balance_print(l_token->header_public.total_supply), - l_token->header_public.flags, - dap_chain_balance_print(l_token->header_public.premine_supply), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); - } - break; - default: - dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); - break; + // Simple private token decl + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 + dap_string_append_printf(l_str_out, " total_supply: %s(%s), signs: valid/total %02d/%02d \n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)), + dap_chain_u256tostr(l_token->header_private.total_supply_256), + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + dap_chain_datoshi_to_coins(l_token->header_private.total_supply), + l_token->header_private.total_supply, + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256 + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)); + dap_string_append_printf(l_str_out, + " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)), + dap_chain_u256tostr(l_token->header_public.total_supply_256), + l_token->header_public.flags, + dap_chain_u256tostr(l_token->header_public.premine_supply_256), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); + dap_string_append_printf(l_str_out, + " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_datoshi_to_coins(l_token->header_public.total_supply), + dap_chain_balance_print(l_token->header_public.total_supply), + l_token->header_public.flags, + dap_chain_balance_print(l_token->header_public.premine_supply), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + }break; + default: + dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); + break; } dap_string_append_printf(l_str_out, "\n"); (*a_token_num)++; @@ -1305,7 +1328,6 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); continue; } - /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); @@ -1327,175 +1349,205 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger l_time_str[0] = '\0'; switch (l_datum->header.type_id) { - // token - case DAP_CHAIN_DATUM_TOKEN_DECL: { - // no token necessary for addr - if(a_filtr_addr_base58) { - break; - } + // 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) { + break; + } - dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ - l_token_num++; - break; - } - if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) { - dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); - switch (l_token->type) { - // Simple private token decl - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", - dap_chain_datoshi_to_coins(l_token->header_private.total_supply), - l_token->header_private.total_supply, - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", - l_token->header_private_decl.tsd_total_size, - l_token->header_private_decl.flags); + dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; + //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ + l_token_num++; break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", - l_token->header_private_update.tsd_total_size, - l_token->header_private_update.padding); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { - char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); - char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); - dap_string_append_printf(l_str_out, - " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - dap_chain_datoshi_to_coins(l_token->header_public.total_supply), - dap_chain_balance_print(l_token->header_public.total_supply), - l_token->header_public.flags, - dap_chain_balance_print(l_token->header_public.premine_supply), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); } - break; - default: - dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); - break; + if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) { + dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); + switch (l_token->type) { + // Simple private token decl + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: // 256 + dap_string_append_printf(l_str_out, " 256_t total_supply: %s(%s), signs: valid/total %02d/%02d \n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_private.total_supply_256)), + dap_chain_u256tostr(l_token->header_private.total_supply_256), + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + dap_chain_datoshi_to_coins(l_token->header_private.total_supply), + l_token->header_private.total_supply, + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: // 256 + dap_string_append_printf(l_str_out, "256_t tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: // 256 + dap_string_append_printf(l_str_out, "256_t tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { // 256 + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); + dap_string_append_printf(l_str_out, + " total_supply: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token->header_public.total_supply_256)), + dap_chain_u256tostr(l_token->header_public.total_supply_256), + l_token->header_public.flags, + dap_chain_u256tostr(l_token->header_public.premine_supply_256), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + } break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { + char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); + dap_string_append_printf(l_str_out, + " total_supply: %.0Lf(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + dap_chain_datoshi_to_coins(l_token->header_public.total_supply), + dap_chain_balance_print(l_token->header_public.total_supply), + l_token->header_public.flags, + dap_chain_balance_print(l_token->header_public.premine_supply), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + } break; + default: + dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); + break; + } + dap_string_append_printf(l_str_out, "\n"); + l_token_num++; } - dap_string_append_printf(l_str_out, "\n"); - l_token_num++; } - } - break; + break; - // emission - case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: - case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_token_num++; - break; - } - size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data); - dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size); - if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) { - char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address)); - // filter for addr - if(dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) { + // emission + case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION: { + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_token_num++; break; } - - if ( l_token_em->hdr.type_value_256 ) { // 256 - dap_string_append_printf(l_str_out, "emission 256: %.0Lf(%s) %s, type: %s, version: %d\n", - dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->hdr.value_256)), - dap_chain_u256tostr(l_token_em->hdr.value_256), - l_token_em->hdr.ticker, - c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], - l_token_em->hdr.version); - } else - dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", - dap_chain_datoshi_to_coins(l_token_em->hdr.value), - l_token_em->hdr.value, - l_token_em->hdr.ticker, - c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], - l_token_em->hdr.version); - - dap_string_append_printf(l_str_out, " to addr: %s\n", l_token_emission_address_str); - - DAP_DELETE(l_token_emission_address_str); - switch (l_token_em->hdr.type) { - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: - dap_string_append_printf(l_str_out, " signs_count: %d\n", l_token_em->data.type_auth.signs_count); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: - dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: - if ( l_token_em->hdr.type_value_256 ) { // 256 - dap_string_append_printf(l_str_out, " value_start: %s(%s), codename: %s\n", - dap_chain_datoshi_to_coins(dap_chain_uint128_from_uint256(l_token_em->data.type_atom_owner.value_start_256)), - dap_chain_u256tostr(l_token_em->data.type_atom_owner.value_start_256), - l_token_em->data.type_atom_owner.value_change_algo_codename - ); - } else { - dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", - dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start), - l_token_em->data.type_atom_owner.value_start, - l_token_em->data.type_atom_owner.value_change_algo_codename - ); + size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data); + dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size); + if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) { + char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address)); + // filter for addr + if(dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) { + break; } - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: { - char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr); - // get time of create datum - if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1) - l_time_str[0] = '\0'; - dap_string_append_printf(l_str_out, " flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str); - dap_string_append_printf(l_str_out, " addr: %s\n", l_addr); - DAP_DELETE(l_addr); + if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256 + dap_string_append_printf(l_str_out, "emission 256: %s(%s) %s, type: %s, version: %d\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->hdr.value_256)), + dap_chain_u256tostr(l_token_em->hdr.value_256), + l_token_em->hdr.ticker, + c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], + l_token_em->hdr.version); + } else + dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", + dap_chain_datoshi_to_coins(l_token_em->hdr.value), + l_token_em->hdr.value, + l_token_em->hdr.ticker, + c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], + l_token_em->hdr.version); + dap_string_append_printf(l_str_out, " to addr: %s\n", l_token_emission_address_str); + + DAP_DELETE(l_token_emission_address_str); + switch (l_token_em->hdr.type) { + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_UNDEFINED: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_AUTH: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: + dap_string_append_printf(l_str_out, " signs_count: %d\n", l_token_em->data.type_auth.signs_count); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ALGO: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: + dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_ATOM_OWNER: // 256 + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + if ( l_token_em->hdr.version == 1 ) { // && l_token_em->hdr.type_256 ) { // 256 + dap_string_append_printf(l_str_out, " value_start: %s(%s), codename: %s\n", + dap_chain_balance_to_coins(dap_chain_uint128_from_uint256(l_token_em->data.type_atom_owner.value_start_256)), + dap_chain_u256tostr(l_token_em->data.type_atom_owner.value_start_256), + l_token_em->data.type_atom_owner.value_change_algo_codename + ); + } else { + dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", + dap_chain_datoshi_to_coins(l_token_em->data.type_atom_owner.value_start), + l_token_em->data.type_atom_owner.value_start, + l_token_em->data.type_atom_owner.value_change_algo_codename + ); + } + break; + // case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_256_SMART_CONTRACT: + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: { + char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr); + // get time of create datum + if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1) + l_time_str[0] = '\0'; + dap_string_append_printf(l_str_out, " flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str); + dap_string_append_printf(l_str_out, " addr: %s\n", l_addr); + DAP_DELETE(l_addr); + } + break; + } + dap_string_append_printf(l_str_out, "\n"); + l_emission_num++; } + DAP_DELETE(l_token_em); + } break; + + // transaction + case DAP_CHAIN_DATUM_TX:{ + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_tx_num++; break; } - dap_string_append_printf(l_str_out, "\n"); - l_emission_num++; - } - DAP_DELETE(l_token_em); - } break; - - // transaction - case DAP_CHAIN_DATUM_TX:{ - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_tx_num++; - break; + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; + //calc tx hash + s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); } + break; - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; - //calc tx hash - s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); - } - break; - - // transaction - case DAP_CHAIN_DATUM_256_TX:{ + // transaction + case DAP_CHAIN_DATUM_256_TX:{ // 256 + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_tx_num++; + break; + } + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; + s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); + } + break; - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_tx_num++; + default: + dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); break; } - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; - s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); - } - break; - - default: - dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); - break; + l_datum_num++; } - l_datum_num++; - } // go to next transaction l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); @@ -1584,7 +1636,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-all' or '-addr' or '-w'"); return -1; } - // Select chain network if(!l_net_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-net'"); @@ -1596,7 +1647,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return -3; } } - //Select chain emission if(!l_chain_str) { // chain may be null -> then all chain use //dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter '-chain'"); @@ -1611,7 +1661,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) } //char *l_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); //const char *l_chain_group = dap_chain_gdb_get_group(l_chain); - dap_chain_hash_fast_t l_tx_hash; if(l_tx_hash_str) { if(dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { @@ -1623,7 +1672,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) // dap_chain_hash_fast_to_str(&l_tx_hash, hash_str,99); // int gsdgsd=523; } - dap_chain_addr_t *l_addr = NULL; // if need addr if(l_wallet_name || l_addr_base58) { @@ -1646,7 +1694,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return -1; } } - dap_string_t *l_str_ret = dap_string_new(NULL); //char *l_str_ret = NULL; dap_chain_t *l_chain_cur; void *l_chain_tmp = (void*)0x1; @@ -1657,7 +1704,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) // all chain else l_chain_cur = dap_chain_enum(&l_chain_tmp); - while(l_chain_cur) { // only selected net @@ -1669,18 +1715,15 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) char *l_str_out = NULL; dap_string_append_printf(l_str_ret, "chain: %s\n", l_chain_cur->name); dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net_str); - if(l_is_all) { // without filters l_str_out = dap_db_history_filter(l_chain_cur, l_ledger, NULL, NULL, l_hash_out_type, -1, 0, NULL, l_list_tx_hash_processd); dap_string_append_printf(l_str_ret, "all history:\n%s\n", l_str_out ? l_str_out : " empty"); } else { - l_str_out = l_tx_hash_str ? dap_db_history_tx(&l_tx_hash, l_chain_cur, l_hash_out_type) : dap_db_history_addr(l_addr, l_chain_cur, l_hash_out_type); - if(l_tx_hash_str) { dap_string_append_printf(l_str_ret, "history for tx hash %s:\n%s\n", l_tx_hash_str, l_str_out ? l_str_out : " empty"); @@ -1701,8 +1744,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_enum_unlock(); l_chain_cur = dap_chain_enum(&l_chain_tmp); } - - DAP_DELETE(l_addr); _dap_chain_tx_hash_processed_ht_free(l_list_tx_hash_processd); // all chain @@ -1713,7 +1754,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) return 0; } else if(l_cmd == CMD_LIST){ - enum {SUBCMD_NONE, SUBCMD_LIST_COIN}; int l_sub_cmd = SUBCMD_NONE; if (dap_chain_node_cli_find_option_val(a_argv, 2, 3, "coins", NULL )) @@ -1739,7 +1779,6 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_string_free(l_str_ret, true); return 0; } else if (l_cmd == CMD_TX_INFO){ - //GET hash dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-hash", &l_tx_hash_str); //get net diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index c119e6afa77981893bb13036830f76634bb8a3b6..192b6211fb370cc1a792388ab7737ae8903068ed 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -624,16 +624,17 @@ static int s_add_atom_to_ledger(dap_chain_cs_blocks_t * a_blocks, dap_ledger_t for(size_t i=0; i<a_block_cache->datum_count; i++){ dap_chain_datum_t *l_datum = a_block_cache->datum[i]; switch (l_datum->header.type_id) { + case DAP_CHAIN_DATUM_256_TOKEN_DECL: case DAP_CHAIN_DATUM_TOKEN_DECL: { dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; l_ret=dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size); } break; case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data; - l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? - true : false; - l_ret=dap_chain_ledger_token_emission_load(a_ledger, l_token_em, l_datum->header.data_size); + // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data; + // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? + // true : false; + l_ret=dap_chain_ledger_token_emission_load(a_ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size); } break; case DAP_CHAIN_DATUM_TX: { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 15640be1d5286e7a0fb538a503b2013051c5b529..c9b8a95cbe473211080b0d48e85cb415eda38ac2 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -291,6 +291,7 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size); pthread_rwlock_t * l_events_rwlock = &PVT(a_dag)->events_rwlock; switch (l_datum->header.type_id) { + case DAP_CHAIN_DATUM_256_TOKEN_DECL: case DAP_CHAIN_DATUM_TOKEN_DECL: { dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; return dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size); @@ -298,10 +299,10 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger break; case DAP_CHAIN_DATUM_256_TOKEN_EMISSION: // 256 case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data; - l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? - true : false; - return dap_chain_ledger_token_emission_load(a_ledger, l_token_em, l_datum->header.data_size); + // dap_chain_datum_token_emission_t *l_token_em = (dap_chain_datum_token_emission_t*) l_datum->data; + // l_token_em->hdr.type_value_256 = l_datum->header.type_id == DAP_CHAIN_DATUM_256_TOKEN_EMISSION ? + // true : false; + return dap_chain_ledger_token_emission_load(a_ledger, (dap_chain_datum_token_emission_t*) l_datum->data, l_datum->header.data_size); } break; case DAP_CHAIN_DATUM_256_TX: // 256