diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index b27c2c2c57e74c182b9bcfd22df6c1c2cc3cd5c5..fea8f12eb6a982aa7b9b851f77db13304ce158f0 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -479,14 +479,14 @@ dap_multi_sign_t *dap_multi_sign_deserialize(dap_sign_type_enum_t a_type, uint8_ l_mem_shift++; memcpy(&l_sign->sign_count, &a_sign[l_mem_shift], 1); l_mem_shift++; - l_sign->key_seq = DAP_NEW_SIZE(dap_multi_sign_keys_t, l_sign->sign_count * sizeof(dap_multi_sign_keys_t)); + l_sign->key_seq = DAP_NEW_Z_SIZE(dap_multi_sign_keys_t, l_sign->sign_count * sizeof(dap_multi_sign_keys_t)); for (int i = 0; i < l_sign->sign_count; i++) { memcpy(&l_sign->key_seq[i].num, &a_sign[l_mem_shift], 1); l_mem_shift++; memcpy(&l_sign->key_seq[i].type, &a_sign[l_mem_shift], sizeof(dap_sign_type_t)); l_mem_shift += sizeof(dap_sign_type_t); } - l_sign->meta = DAP_NEW_SIZE(dap_multi_sign_meta_t, l_sign->sign_count * sizeof(dap_multi_sign_meta_t)); + l_sign->meta = DAP_NEW_Z_SIZE(dap_multi_sign_meta_t, l_sign->sign_count * sizeof(dap_multi_sign_meta_t)); size_t l_pkeys_size = 0, l_signes_size = 0; for (int i = 0; i < l_sign->sign_count; i++) { memcpy(&l_sign->meta[i].pkey_size, &a_sign[l_mem_shift], sizeof(uint32_t)); @@ -496,13 +496,13 @@ dap_multi_sign_t *dap_multi_sign_deserialize(dap_sign_type_enum_t a_type, uint8_ l_mem_shift += sizeof(uint32_t); l_signes_size += l_sign->meta[i].sign_size; } - l_sign->key_hashes = DAP_NEW_SIZE(dap_chain_hash_fast_t, l_sign->total_count * sizeof(dap_chain_hash_fast_t)); + l_sign->key_hashes = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, l_sign->total_count * sizeof(dap_chain_hash_fast_t)); for (int i = 0; i < l_sign->total_count; i++) { memcpy(&l_sign->key_hashes[i], &a_sign[l_mem_shift], sizeof(dap_chain_hash_fast_t)); l_mem_shift += sizeof(dap_chain_hash_fast_t); } uint32_t l_data_shift = 0, l_data_size = 0; - l_sign->pub_keys = DAP_NEW_SIZE(uint8_t, l_pkeys_size); + l_sign->pub_keys = DAP_NEW_Z_SIZE(uint8_t, l_pkeys_size); for (int i = 0; i < l_sign->sign_count; i++) { l_data_size = l_sign->meta[i].pkey_size; memcpy( &l_sign->pub_keys[l_data_shift], &a_sign[l_mem_shift],l_data_size); @@ -510,7 +510,7 @@ dap_multi_sign_t *dap_multi_sign_deserialize(dap_sign_type_enum_t a_type, uint8_ l_data_shift += l_data_size; } l_data_shift = l_data_size = 0; - l_sign->sign_data = DAP_NEW_SIZE(uint8_t, l_signes_size); + l_sign->sign_data = DAP_NEW_Z_SIZE(uint8_t, l_signes_size); for (int i = 0; i < l_sign->sign_count; i++) { l_data_size = l_sign->meta[i].sign_size; memcpy(&l_sign->sign_data[l_data_shift], &a_sign[l_mem_shift], l_data_size); @@ -632,7 +632,7 @@ dap_multi_sign_t *dap_multi_sign_create(dap_multi_sign_params_t *a_params, const dap_multi_sign_t *l_sign = DAP_NEW_Z(dap_multi_sign_t); l_sign->type = a_params->type; l_sign->total_count = a_params->total_count; - l_sign->key_hashes = DAP_NEW_SIZE(dap_chain_hash_fast_t, a_params->total_count * sizeof(dap_chain_hash_fast_t)); + l_sign->key_hashes = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, a_params->total_count * sizeof(dap_chain_hash_fast_t)); for (int i = 0; i < a_params->total_count; i++) { if (!dap_hash_fast(a_params->keys[i]->pub_key_data, a_params->keys[i]->pub_key_data_size, &l_sign->key_hashes[i])) { log_it (L_ERROR, "Can't create multi-signature hash"); @@ -641,8 +641,8 @@ dap_multi_sign_t *dap_multi_sign_create(dap_multi_sign_params_t *a_params, const } } l_sign->sign_count = a_params->sign_count; - l_sign->key_seq = DAP_NEW_SIZE(dap_multi_sign_keys_t, a_params->sign_count * sizeof(dap_multi_sign_keys_t)); - l_sign->meta = DAP_NEW_SIZE(dap_multi_sign_meta_t, a_params->sign_count * sizeof(dap_multi_sign_meta_t)); + l_sign->key_seq = DAP_NEW_Z_SIZE(dap_multi_sign_keys_t, a_params->sign_count * sizeof(dap_multi_sign_keys_t)); + l_sign->meta = DAP_NEW_Z_SIZE(dap_multi_sign_meta_t, a_params->sign_count * sizeof(dap_multi_sign_meta_t)); for (int i = 0; i < l_sign->sign_count; i++) { uint8_t l_num = a_params->key_seq[i]; l_sign->key_seq[i].num = l_num; @@ -674,7 +674,7 @@ dap_multi_sign_t *dap_multi_sign_create(dap_multi_sign_params_t *a_params, const uint8_t *l_pkey = dap_sign_get_pkey(l_dap_sign_step, &l_pkey_size); l_sign->meta[i].pkey_size = l_pkey_size; if (l_pkeys_mem_shift == 0) { - l_sign->pub_keys = DAP_NEW_SIZE(uint8_t, l_pkey_size); + l_sign->pub_keys = DAP_NEW_Z_SIZE(uint8_t, l_pkey_size); } else { l_sign->pub_keys = DAP_REALLOC(l_sign->pub_keys, l_pkeys_mem_shift + l_pkey_size); } @@ -683,7 +683,7 @@ dap_multi_sign_t *dap_multi_sign_create(dap_multi_sign_params_t *a_params, const uint8_t *l_sign_step = dap_sign_get_sign(l_dap_sign_step, &l_sign_size); l_sign->meta[i].sign_size = l_sign_size; if (l_signs_mem_shift == 0) { - l_sign->sign_data = DAP_NEW_SIZE(uint8_t, l_sign_size); + l_sign->sign_data = DAP_NEW_Z_SIZE(uint8_t, l_sign_size); } else { l_sign->sign_data = DAP_REALLOC(l_sign->sign_data, l_signs_mem_shift + l_sign_size); } diff --git a/dap-sdk/crypto/src/newhope/newhope.pri b/dap-sdk/crypto/src/newhope/newhope.pri index 7f618fd998c64c703a491a08b0d0f6240454243c..19a232bca15fc416a165badc40c3aba904019c59 100755 --- a/dap-sdk/crypto/src/newhope/newhope.pri +++ b/dap-sdk/crypto/src/newhope/newhope.pri @@ -1,3 +1,3 @@ -INCLUDEPATH += $$PW +INCLUDEPATH += $$PWD HEADERS += $$PWD/newhope_api.h $$PWD/newhope_cpakem.h $$PWD/newhope_cpapke.h $$PWD/newhope_ntt.h $$PWD/newhope_params.h $$PWD/newhope_poly.h $$PWD/newhope_reduce.h SOURCES += $$PWD/newhope_cpakem.c $$PWD/newhope_cpapke.c $$PWD/newhope_ntt.c $$PWD/newhope_poly.c $$PWD/newhope_precomp.c $$PWD/newhope_reduce.c diff --git a/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c b/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c index 2a7a47bb0b41e63943080599a161a5e1af92b295..ffb2c87b5c6d7d3088639b2cc2443721ceb230c9 100755 --- a/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c +++ b/dap-sdk/crypto/test/crypto/dap_enc_sign_multi_test.c @@ -69,5 +69,5 @@ void dap_enc_multi_sign_tests_run() dap_print_module_name("dap_enc_sign_multi"); init_test_case(); - benchmark_mgs_time("Signing and verifying message 1 time", benchmark_test_time(test_signing_verifying, 1)); + benchmark_mgs_time("Signing and verifying message 1 time", benchmark_test_time(test_signing_verifying, 10)); } diff --git a/dap-sdk/crypto/test/crypto/main.c b/dap-sdk/crypto/test/crypto/main.c index fe0887d99f357598c5d9eedbefd79a7f94e6049d..e1073d68602601603c7c5642bea5ce86e1f94b68 100755 --- a/dap-sdk/crypto/test/crypto/main.c +++ b/dap-sdk/crypto/test/crypto/main.c @@ -20,7 +20,7 @@ int main(void) // switch off debug info from library dap_log_level_set(L_CRITICAL); const int test_numbers = 100; - //dap_enc_multi_sign_tests_run();return 0; + dap_enc_multi_sign_tests_run(); dap_enc_newhope_tests_run(test_numbers); test_encypt_decrypt (test_numbers, DAP_ENC_KEY_TYPE_SEED_OFB, 32); test_encypt_decrypt_fast (test_numbers, DAP_ENC_KEY_TYPE_SEED_OFB, 32); diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index 6060e27a3f02081a19c98a942885ceeace575afb..2d5ad7d20f40971b3dfb2f06cf858f79404f688d 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -264,6 +264,12 @@ int dap_events_socket_kill_socket( dap_events_socket_t *a_es ) return -1; } + if( !a_es->dap_worker ) { + log_it( L_WARNING, "%s: socket %u has no worker thread", __PRETTY_FUNCTION__, a_es->socket ); + a_es->kill_signal = true; + return 0; + } + uint32_t tn = a_es->dap_worker->number_thread; dap_worker_t *w = a_es->dap_worker; diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c index dd199b333ba93de547e37584e4b2684bb0ce1b0d..f50290948436b444260c62a2e1b59e6b9dad0ad4 100644 --- a/dap-sdk/net/core/dap_server.c +++ b/dap-sdk/net/core/dap_server.c @@ -66,6 +66,7 @@ #include "dap_common.h" #include "dap_server.h" +#include "dap_strfuncs.h" #define LOG_TAG "server" @@ -740,8 +741,6 @@ int32_t dap_server_loop( dap_server_t *d_server ) static uint32_t pickthread = 0; // just for test pthread_t thread_listener[ DAP_MAX_THREADS ]; - if ( !d_server ) return 1; - for( uint32_t i = 0; i < _count_threads; ++i ) { EPOLL_HANDLE efd = epoll_create1( 0 ); @@ -767,49 +766,55 @@ int32_t dap_server_loop( dap_server_t *d_server ) struct epoll_event pev; struct epoll_event events[ 16 ]; - memset(&pev, 0, sizeof(pev)); - pev.events = EPOLLIN | EPOLLERR; - pev.data.fd = d_server->socket_listener; + if(d_server){ + memset(&pev, 0, sizeof(pev)); + pev.events = EPOLLIN | EPOLLERR; + pev.data.fd = d_server->socket_listener; - if( epoll_ctl( efd, EPOLL_CTL_ADD, d_server->socket_listener, &pev) != 0 ) { - log_it( L_ERROR, "epoll_ctl failed 004" ); - goto error; + if( epoll_ctl( efd, EPOLL_CTL_ADD, d_server->socket_listener, &pev) != 0 ) { + log_it( L_ERROR, "epoll_ctl failed 004" ); + goto error; + } } while( !bQuitSignal ) { + if(d_server){ + int32_t n = epoll_wait( efd, &events[0], 16, -1 ); - int32_t n = epoll_wait( efd, &events[0], 16, -1 ); + if ( bQuitSignal ) + break; - if ( bQuitSignal ) - break; + if ( n <= 0 ) { + if ( errno == EINTR ) + continue; + log_it( L_ERROR, "Server wakeup no events / error" ); + break; + } - if ( n <= 0 ) { - if ( errno == EINTR ) - continue; - log_it( L_ERROR, "Server wakeup no events / error" ); - break; - } + for( int32_t i = 0; i < n; ++ i ) { - for( int32_t i = 0; i < n; ++ i ) { + if ( events[i].events & EPOLLIN ) { - if ( events[i].events & EPOLLIN ) { + int client_fd = accept( events[i].data.fd, 0, 0 ); - int client_fd = accept( events[i].data.fd, 0, 0 ); + if ( client_fd < 0 ) { + log_it( L_ERROR, "accept_cb: error accept socket"); + continue; + } - if ( client_fd < 0 ) { - log_it( L_ERROR, "accept_cb: error accept socket"); - continue; + set_nonblock_socket( client_fd ); + dap_server_add_socket( client_fd, -1 ); + } + else if( events[i].events & EPOLLERR ) { + log_it( L_ERROR, "Server socket error event" ); + goto exit; } - set_nonblock_socket( client_fd ); - dap_server_add_socket( client_fd, -1 ); - } - else if( events[i].events & EPOLLERR ) { - log_it( L_ERROR, "Server socket error event" ); - goto exit; - } - - } // for + } // for + }else{ + static const int c_dap_server_client_mode_tick_rate = 200; + dap_usleep(DAP_USEC_PER_SEC / c_dap_server_client_mode_tick_rate); + } } // while diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 72febb8922a11d6f9c35cb0d2c067a5826af66f6..031b3ebffe787f381a9cc175f629239d14a36e10 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -125,13 +125,58 @@ dap_chain_datum_token_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token void dap_chain_datum_token_flags_dump(dap_string_t * a_str_out, uint16_t a_flags) { if(!a_flags){ - dap_string_append_printf(a_str_out, "<NONE>\n"); + dap_string_append_printf(a_str_out, "%s\n", + c_dap_chain_datum_token_flag_str[DAP_CHAIN_DATUM_TOKEN_FLAG_NONE]); return; } - for ( uint16_t i = 0; (2^i) <=DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++ ){ - if( a_flags & (2^i) ) - dap_string_append_printf(a_str_out,"%s%s", c_dap_chain_datum_token_flag_str[2^i], - (2^i)==DAP_CHAIN_DATUM_TOKEN_FLAG_MAX?",":"\n" ); + bool is_first = true; + for ( uint16_t i = 0; i <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){ + if( a_flags & (1 << i) ){ + if(is_first) + is_first = false; + else + dap_string_append_printf(a_str_out,", "); + dap_string_append_printf(a_str_out,"%s", c_dap_chain_datum_token_flag_str[i]); + } + if(i == DAP_CHAIN_DATUM_TOKEN_FLAG_MAX) + dap_string_append_printf(a_str_out, "\n"); } } + +/** + * @brief dap_chain_datum_token_certs_dump + * @param a_str_out + * @param a_data_n_tsd + * @param a_certs_size + */ +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_string_append_printf(a_str_out, "signatures: "); + if (!a_certs_size) { + dap_string_append_printf(a_str_out, "<NONE>\n"); + return; + } + + dap_string_append_printf(a_str_out, "\n"); + + size_t l_offset = 0; + for (int i = 1; l_offset < (a_certs_size); i++) { + dap_sign_t *l_sign = (dap_sign_t *) (a_data_n_tsd + l_offset); + l_offset += dap_sign_get_size(l_sign); + if (l_sign->header.sign_size == 0) { + dap_string_append_printf(a_str_out, "<CORRUPTED - 0 size signature>\n"); + continue; + } + + dap_chain_hash_fast_t l_pkey_hash = {0}; + if (dap_sign_get_pkey_hash(l_sign, &l_pkey_hash) == false) { + dap_string_append_printf(a_str_out, "<CORRUPTED - can't calc hash>\n"); + continue; + } + + char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); + + dap_string_append_printf(a_str_out, "%d) %s, %s, %lu bytes\n", i, l_hash_str, + dap_sign_type_to_str(l_sign->header.type), l_sign->header.sign_size); + } +} diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 32e2f42eb5787b38fb40bb1ebb78bbbdd80ee4c5..d130cec690b5597b0cd196cf8b8974d980de3709 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -237,6 +237,7 @@ extern const char *c_dap_chain_datum_token_emission_type_str[]; dap_chain_datum_token_tsd_t * dap_chain_datum_token_tsd_create(uint16_t a_type, const void * a_data, size_t a_data_size); dap_chain_datum_token_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); #define dap_chain_datum_token_tsd_create_scalar(type,value) dap_chain_datum_token_tsd_create (type, &value, sizeof(value) ) #define dap_chain_datum_token_tsd_get_scalar(a,typeconv) *((typeconv*) a->data) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 30e9e292fa1acf50b62c867a96d97b9275ef2a7a..04cbb57a92b7dd73f18fa2c9d9eb2bfee969b350 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2217,7 +2217,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ char *l_hash_str = dap_chain_hash_fast_to_str_new( (dap_chain_hash_fast_t*) l_tsd->data ); - dap_string_append_printf(a_str_out,"total_signs_remoev: %s\n", l_hash_str ); + dap_string_append_printf(a_str_out,"total_signs_remove: %s\n", l_hash_str ); DAP_DELETE( l_hash_str ); }else dap_string_append_printf(a_str_out,"total_signs_add: <WRONG SIZE %zd>\n", l_tsd->size); @@ -2281,13 +2281,14 @@ 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,"type: PRIVATE_DECL\n"); dap_string_append_printf(a_str_out,"flags: "); dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_decl.flags); - dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_get(l_token, l_token_size); - if (l_tsd == NULL) + dap_chain_datum_token_tsd_t * l_tsd_first = dap_chain_datum_token_tsd_get(l_token, l_token_size); + if (l_tsd_first == NULL) dap_string_append_printf(a_str_out,"<CORRUPTED TSD SECTION>\n"); else{ size_t l_offset = 0; size_t l_offset_max = l_token->header_private_decl.tsd_total_size; while( l_offset< l_offset_max){ + dap_chain_datum_token_tsd_t * l_tsd = (void*)l_tsd_first + l_offset; if ( (l_tsd->size+l_offset) >l_offset_max){ log_it(L_WARNING, "<CORRUPTED TSD> too big size %zd when left maximum %zd", l_tsd->size, l_offset_max - l_offset); @@ -2295,7 +2296,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da } switch( l_tsd->type){ case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: - dap_string_append_printf(a_str_out,"total_supply: %u\n", + dap_string_append_printf(a_str_out,"total_supply: %lu\n", dap_chain_datum_token_tsd_get_scalar(l_tsd, uint128_t) ); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID : @@ -2332,6 +2333,9 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da } } + + int 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_TOKEN_TYPE_PUBLIC:{ dap_string_append_printf(a_str_out,"type: PUBLIC\n"); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 1513a12acc6be27e541c70dbba42ca760b2024b5..b4272b63e2e90185c59ae6861523363424cbffe9 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2294,7 +2294,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply dap_chain_node_cli_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags); return -20; } - l_flags |= l_flag; + l_flags |= (1<<l_flag); l_str_flags++; } // Add flags as set_flags TDS section @@ -2337,6 +2337,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); }else if ( strcmp( argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid uint16_t l_param_value = (uint16_t)atoi(l_arg_param); + l_signs_total = l_param_value; dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_scalar( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID, l_param_value); dap_list_append( l_tsd_list, l_tsd); @@ -2604,7 +2605,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Flag can't be \"%s\"",*l_str_flags); return -20; } - l_flags |= l_flag; + l_flags |= (1<<l_flag); l_str_flags++; } } else if ( strcmp( argv[l_arg_index],"-total_supply" )==0){ // Total supply @@ -2613,8 +2614,9 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY, l_param_value); dap_list_append( l_tsd_list, l_tsd); l_tsd_total_size+= dap_chain_datum_token_tsd_size( l_tsd); - }else if ( strcmp( argv[l_arg_index],"-signs_valid" )==0){ // Signs valid + }else if ( strcmp( argv[l_arg_index],"-total_signs_valid" )==0){ // Signs valid uint16_t l_param_value = (uint16_t)atoi(l_arg_param); + l_signs_total = l_param_value; dap_chain_datum_token_tsd_t * l_tsd = dap_chain_datum_token_tsd_create_scalar( DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID, l_param_value); dap_list_append( l_tsd_list, l_tsd); @@ -2700,7 +2702,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) } switch (l_tsd->type){ case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: - log_it(L_DEBUG,"== TOTAL_SUPPLY: %llf.20", + log_it(L_DEBUG,"== TOTAL_SUPPLY: %0.9llf", dap_chain_balance_to_coins( dap_chain_datum_token_tsd_get_scalar(l_tsd,uint128_t) ) ); break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID: