diff --git a/dap-sdk b/dap-sdk index 417a8e53d860dd74d80a257131402a5507be1f62..c9aae9ce01308a85586b770adf02badb6c9c6a39 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 417a8e53d860dd74d80a257131402a5507be1f62 +Subproject commit c9aae9ce01308a85586b770adf02badb6c9c6a39 diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 370a919ac37ef36837d2864bc196be379a1f5af2..6f7f30de5096b901005ff1fe5d7237124744ac76 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -7,7 +7,6 @@ endif() # Chains if (CELLFRAME_MODULES MATCHES "chains") add_subdirectory(chain) - add_subdirectory(chain/btc_rpc) add_subdirectory(wallet) endif() @@ -21,6 +20,7 @@ if (CELLFRAME_MODULES MATCHES "network") add_subdirectory(mempool) add_subdirectory(net) add_subdirectory(net/srv) + add_subdirectory(json_rpc) # Stream channels add_subdirectory(channel/chain) add_subdirectory(channel/chain-net) diff --git a/modules/chain/btc_rpc/CMakeLists.txt b/modules/chain/btc_rpc/CMakeLists.txt deleted file mode 100644 index 3586fae78d0c84ddd6dad1ae39178a251af45873..0000000000000000000000000000000000000000 --- a/modules/chain/btc_rpc/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -project(dap_chain_btc_rpc C) -cmake_minimum_required(VERSION 3.10) - -add_definitions ("-D_GNU_SOURCE") -add_definitions("-Dfpic") - -file(GLOB BTC_RPC_HEADERS include/*.h) -file(GLOB BTC_RPC_SRCS *.c) - -include_directories(${PROJECT_NAME} include/) - -add_library(${PROJECT_NAME} STATIC ${BTC_RPC_HEADERS} ${BTC_RPC_SRCS}) -target_include_directories(${PROJECT_NAME} INTERFACE . include/) -target_include_directories(${PROJECT_NAME} PUBLIC include) - -target_link_libraries(${PROJECT_NAME} dap_core dap_json_rpc) diff --git a/modules/chain/btc_rpc/dap_chain_btc_rpc.c b/modules/chain/btc_rpc/dap_chain_btc_rpc.c deleted file mode 100644 index 448528116b41719aa8000aa430b130b82a4e334c..0000000000000000000000000000000000000000 --- a/modules/chain/btc_rpc/dap_chain_btc_rpc.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "dap_chain_btc_rpc.h" - -int dap_chain_btc_rpc_init(){ - dap_chain_btc_rpc_registration_handlers(); - return 0; -} -void dap_chain_btc_rpc_deinit(){ - dap_chain_btc_rpc_unregistration_handlers(); -} diff --git a/modules/chain/btc_rpc/dap_chain_btc_rpc_handlers.c b/modules/chain/btc_rpc/dap_chain_btc_rpc_handlers.c deleted file mode 100644 index e39ce1a2e702aa9f0b3fe55bf0952526c5241c17..0000000000000000000000000000000000000000 --- a/modules/chain/btc_rpc/dap_chain_btc_rpc_handlers.c +++ /dev/null @@ -1,143 +0,0 @@ -#include "dap_chain_btc_rpc_handlers.h" - -void dap_chain_btc_rpc_registration_handlers(){ - dap_json_rpc_registration_request_handler("addmultisigaddress", dap_chain_btc_rpc_handler_addmultisigaddress); - dap_json_rpc_registration_request_handler("addnode", dap_chain_btc_rpc_handler_addnode); - dap_json_rpc_registration_request_handler("backupwallet", dap_chain_btc_rpc_handler_backupwallet); - dap_json_rpc_registration_request_handler("createmultisig", dap_chain_btc_rpc_handler_createmultisig); - dap_json_rpc_registration_request_handler("createrawtransaction", dap_chain_btc_rpc_handler_createrawtransaction); - dap_json_rpc_registration_request_handler("decoderawtransaction", dap_chain_btc_rpc_handler_decoderawtransaction); - dap_json_rpc_registration_request_handler("dumpprivkey", dap_chain_btc_rpc_handler_dumpprivkey); - dap_json_rpc_registration_request_handler("dumpwallet", dap_chain_btc_rpc_handler_dumpwallet); - dap_json_rpc_registration_request_handler("encryptwallet", dap_chain_btc_rpc_handler_encryptwallet); - dap_json_rpc_registration_request_handler("getaccount", dap_chain_btc_rpc_handler_getaccount); - dap_json_rpc_registration_request_handler("getaccountaddress", dap_chain_btc_rpc_handler_getaccountaddress); - dap_json_rpc_registration_request_handler("getaddednodeinfo", dap_chain_btc_rpc_handler_getaddednodeinfo); - dap_json_rpc_registration_request_handler("getaddressesbyaccount", dap_chain_btc_rpc_handler_getaddressesbyaccount); - dap_json_rpc_registration_request_handler("getbalance", dap_chain_btc_rpc_handler_getbalance); - dap_json_rpc_registration_request_handler("getbestblockhash", dap_chain_btc_rpc_handler_getbestblockhash); - dap_json_rpc_registration_request_handler("getblock", dap_chain_btc_rpc_handler_getblock); - dap_json_rpc_registration_request_handler("getblockcount", dap_chain_btc_rpc_handler_getblockcount); - dap_json_rpc_registration_request_handler("getblockhash", dap_chain_btc_rpc_handler_getblockhash); - dap_json_rpc_registration_request_handler("getblocknumber", dap_chain_btc_rpc_handler_getblocknumber); - dap_json_rpc_registration_request_handler("getblocktemplate", dap_chain_btc_rpc_handler_getblocktemplate); - dap_json_rpc_registration_request_handler("getconnectioncount", dap_chain_btc_rpc_handler_getconnectioncount); - dap_json_rpc_registration_request_handler("getdifficulty", dap_chain_btc_rpc_handler_getdifficulty); - dap_json_rpc_registration_request_handler("getgenerate", dap_chain_btc_rpc_handler_getgenerate); - dap_json_rpc_registration_request_handler("gethashespersec", dap_chain_btc_rpc_handler_gethashespersec); - dap_json_rpc_registration_request_handler("getinfo", dap_chain_btc_rpc_handler_getinfo); - dap_json_rpc_registration_request_handler("getmemorypool", dap_chain_btc_rpc_handler_getmemorypool); - dap_json_rpc_registration_request_handler("getmininginfo", dap_chain_btc_rpc_handler_getmininginfo); - dap_json_rpc_registration_request_handler("getnewaddress", dap_chain_btc_rpc_handler_getnewaddress); - dap_json_rpc_registration_request_handler("getpeerinfo", dap_chain_btc_rpc_handler_getpeerinfo); - dap_json_rpc_registration_request_handler("getrawchangeaddress", dap_chain_btc_rpc_handler_getrawchangeaddress); - dap_json_rpc_registration_request_handler("getrawmempool", dap_chain_btc_rpc_handler_getrawmempool); - dap_json_rpc_registration_request_handler("getrawtransaction", dap_chain_btc_rpc_handler_getrawtransaction); - dap_json_rpc_registration_request_handler("getreceivedbyaccount", dap_chain_btc_rpc_handler_getreceivedbyaccount); - dap_json_rpc_registration_request_handler("getreceivedbyaddress", dap_chain_btc_rpc_handler_getreceivedbyaddress); - dap_json_rpc_registration_request_handler("gettransaction", dap_chain_btc_rpc_handler_gettransaction); - dap_json_rpc_registration_request_handler("gettxout", dap_chain_btc_rpc_handler_gettxout); - dap_json_rpc_registration_request_handler("gettxoutsetinfo", dap_chain_btc_rpc_handler_gettxoutsetinfo); - dap_json_rpc_registration_request_handler("getwork", dap_chain_btc_rpc_handler_getwork); - dap_json_rpc_registration_request_handler("help", dap_chain_btc_rpc_handler_help); - dap_json_rpc_registration_request_handler("importprivkey", dap_chain_btc_rpc_handler_importprivkey); - dap_json_rpc_registration_request_handler("invalidateblock", dap_chain_btc_rpc_handler_invalidateblock); - dap_json_rpc_registration_request_handler("keypoolrefill", dap_chain_btc_rpc_handler_keypoolrefill); - dap_json_rpc_registration_request_handler("listaccounts", dap_chain_btc_rpc_handler_listaccounts); - dap_json_rpc_registration_request_handler("listaddressgroupings", dap_chain_btc_rpc_handler_listaddressgroupings); - dap_json_rpc_registration_request_handler("listreceivedbyaccount", dap_chain_btc_rpc_handler_listreceivedbyaccount); - dap_json_rpc_registration_request_handler("listreceivedbyaddress", dap_chain_btc_rpc_handler_listreceivedbyaddress); - dap_json_rpc_registration_request_handler("listsinceblock", dap_chain_btc_rpc_handler_listsinceblock); - dap_json_rpc_registration_request_handler("listtransactions", dap_chain_btc_rpc_handler_listtransactions); - dap_json_rpc_registration_request_handler("listunspent", dap_chain_btc_rpc_handler_listunspent); - dap_json_rpc_registration_request_handler("listlockunspent", dap_chain_btc_rpc_handler_listlockunspent); - dap_json_rpc_registration_request_handler("lockunspent", dap_chain_btc_rpc_handler_lockunspent); - dap_json_rpc_registration_request_handler("move", dap_chain_btc_rpc_handler_move); - dap_json_rpc_registration_request_handler("sendfrom", dap_chain_btc_rpc_handler_sendfrom); - dap_json_rpc_registration_request_handler("sendmany", dap_chain_btc_rpc_handler_sendmany); - dap_json_rpc_registration_request_handler("sendrawtransaction", dap_chain_btc_rpc_handler_sendrawtransaction); - dap_json_rpc_registration_request_handler("sendtoaddress", dap_chain_btc_rpc_handler_sendtoaddress); - dap_json_rpc_registration_request_handler("setaccount", dap_chain_btc_rpc_handler_setaccount); - dap_json_rpc_registration_request_handler("setgenerate", dap_chain_btc_rpc_handler_setgenerate); - dap_json_rpc_registration_request_handler("settxfee", dap_chain_btc_rpc_handler_settxfee); - dap_json_rpc_registration_request_handler("signmessage", dap_chain_btc_rpc_handler_signmessage); - dap_json_rpc_registration_request_handler("signrawtransaction", dap_chain_btc_rpc_handler_signrawtransaction); - dap_json_rpc_registration_request_handler("stop", dap_chain_btc_rpc_handler_stop); - dap_json_rpc_registration_request_handler("submitblock", dap_chain_btc_rpc_handler_submitblock); - dap_json_rpc_registration_request_handler("validateaddress", dap_chain_btc_rpc_handler_validateaddress); - dap_json_rpc_registration_request_handler("verifymessage", dap_chain_btc_rpc_handler_verifymessage); - dap_json_rpc_registration_request_handler("walletlock", dap_chain_btc_rpc_handler_walletlock); - dap_json_rpc_registration_request_handler("walletpassphrase", dap_chain_btc_rpc_handler_walletpassphrase); - dap_json_rpc_registration_request_handler("walletpassphrasechange", dap_chain_btc_rpc_handler_walletpassphrasechange); -} - -void dap_chain_btc_rpc_unregistration_handlers(){ - dap_json_rpc_unregistration_request_handler("addmultisigaddress"); - dap_json_rpc_unregistration_request_handler("addnode"); - dap_json_rpc_unregistration_request_handler("backupwallet"); - dap_json_rpc_unregistration_request_handler("createmultisig"); - dap_json_rpc_unregistration_request_handler("createrawtransaction"); - dap_json_rpc_unregistration_request_handler("decoderawtransaction"); - dap_json_rpc_unregistration_request_handler("dumpprivkey"); - dap_json_rpc_unregistration_request_handler("dumpwallet"); - dap_json_rpc_unregistration_request_handler("encryptwallet"); - dap_json_rpc_unregistration_request_handler("getaccount"); - dap_json_rpc_unregistration_request_handler("getaccountaddress"); - dap_json_rpc_unregistration_request_handler("getaddednodeinfo"); - dap_json_rpc_unregistration_request_handler("getaddressesbyaccount"); - dap_json_rpc_unregistration_request_handler("getbalance"); - dap_json_rpc_unregistration_request_handler("getbestblockhash"); - dap_json_rpc_unregistration_request_handler("getblock"); - dap_json_rpc_unregistration_request_handler("getblockcount"); - dap_json_rpc_unregistration_request_handler("getblockhash"); - dap_json_rpc_unregistration_request_handler("getblocknumber"); - dap_json_rpc_unregistration_request_handler("getblocktemplate"); - dap_json_rpc_unregistration_request_handler("getconnectioncount"); - dap_json_rpc_unregistration_request_handler("getdifficulty"); - dap_json_rpc_unregistration_request_handler("getgenerate"); - dap_json_rpc_unregistration_request_handler("gethashespersec"); - dap_json_rpc_unregistration_request_handler("getinfo"); - dap_json_rpc_unregistration_request_handler("getmemorypool"); - dap_json_rpc_unregistration_request_handler("getmininginfo"); - dap_json_rpc_unregistration_request_handler("getnewaddress"); - dap_json_rpc_unregistration_request_handler("getpeerinfo"); - dap_json_rpc_unregistration_request_handler("getrawchangeaddress"); - dap_json_rpc_unregistration_request_handler("getrawmempool"); - dap_json_rpc_unregistration_request_handler("getrawtransaction"); - dap_json_rpc_unregistration_request_handler("getreceivedbyaccount"); - dap_json_rpc_unregistration_request_handler("getreceivedbyaddress"); - dap_json_rpc_unregistration_request_handler("gettransaction"); - dap_json_rpc_unregistration_request_handler("gettxout"); - dap_json_rpc_unregistration_request_handler("gettxoutsetinfo"); - dap_json_rpc_unregistration_request_handler("getwork"); - dap_json_rpc_unregistration_request_handler("help"); - dap_json_rpc_unregistration_request_handler("importprivkey"); - dap_json_rpc_unregistration_request_handler("invalidateblock"); - dap_json_rpc_unregistration_request_handler("keypoolrefill"); - dap_json_rpc_unregistration_request_handler("listaccounts"); - dap_json_rpc_unregistration_request_handler("listaddressgroupings"); - dap_json_rpc_unregistration_request_handler("listreceivedbyaccount"); - dap_json_rpc_unregistration_request_handler("listreceivedbyaddress"); - dap_json_rpc_unregistration_request_handler("listsinceblock"); - dap_json_rpc_unregistration_request_handler("listtransactions"); - dap_json_rpc_unregistration_request_handler("listunspent"); - dap_json_rpc_unregistration_request_handler("listlockunspent"); - dap_json_rpc_unregistration_request_handler("lockunspent"); - dap_json_rpc_unregistration_request_handler("move"); - dap_json_rpc_unregistration_request_handler("sendfrom"); - dap_json_rpc_unregistration_request_handler("sendmany"); - dap_json_rpc_unregistration_request_handler("sendrawtransaction"); - dap_json_rpc_unregistration_request_handler("sendtoaddress"); - dap_json_rpc_unregistration_request_handler("setaccount"); - dap_json_rpc_unregistration_request_handler("setgenerate"); - dap_json_rpc_unregistration_request_handler("settxfee"); - dap_json_rpc_unregistration_request_handler("signmessage"); - dap_json_rpc_unregistration_request_handler("signrawtransaction"); - dap_json_rpc_unregistration_request_handler("stop"); - dap_json_rpc_unregistration_request_handler("submitblock"); - dap_json_rpc_unregistration_request_handler("validateaddress"); - dap_json_rpc_unregistration_request_handler("verifymessage"); - dap_json_rpc_unregistration_request_handler("walletlock"); - dap_json_rpc_unregistration_request_handler("walletpassphrase"); - dap_json_rpc_unregistration_request_handler("walletpassphrasechange"); -} diff --git a/modules/chain/btc_rpc/include/dap_chain_btc_rpc.h b/modules/chain/btc_rpc/include/dap_chain_btc_rpc.h deleted file mode 100644 index 1196448f3ed1a4f94a81d491c3e3c9ace35cd16d..0000000000000000000000000000000000000000 --- a/modules/chain/btc_rpc/include/dap_chain_btc_rpc.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include "dap_chain_btc_rpc_handlers.h" - -int dap_chain_btc_rpc_init(); -void dap_chain_btc_rpc_deinit(); diff --git a/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h b/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h deleted file mode 100644 index d019041e44c27b02433a00892f8143d33cb1cec5..0000000000000000000000000000000000000000 --- a/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h +++ /dev/null @@ -1,84 +0,0 @@ -#pragma once - -#include "dap_json_rpc_request_handler.h" - -void dap_chain_btc_rpc_registration_handlers(); -void dap_chain_btc_rpc_unregistration_handlers(); - -void dap_chain_btc_rpc_handler_addmultisigaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_addnode(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_backupwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_createmultisig(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_createrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_decoderawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_dumpprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_dumpwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_encryptwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getaccountaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getaddednodeinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getaddressesbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getbalance(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getbestblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getblockcount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getblocknumber(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getblocktemplate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getconnectioncount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getdifficulty(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_gethashespersec(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getmemorypool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getmininginfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - -void dap_chain_btc_rpc_handler_getnewaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getpeerinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getrawchangeaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getrawmempool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_gettransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_gettxout(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_gettxoutsetinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getwork(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - -void dap_chain_btc_rpc_handler_help(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - -void dap_chain_btc_rpc_handler_importprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_invalidateblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_keypoolrefill(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listaccounts(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listaddressgroupings(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - -void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listsinceblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listtransactions(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listlockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_lockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_move(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - -void dap_chain_btc_rpc_handler_sendfrom(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_sendmany(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_sendrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_sendtoaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_setaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_setgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_settxfee(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_signmessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_signrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_stop(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_submitblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - -void dap_chain_btc_rpc_handler_validateaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_verifymessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_walletlock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_walletpassphrase(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_walletpassphrasechange(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); - - diff --git a/modules/common/CMakeLists.txt b/modules/common/CMakeLists.txt index 08bba6401c2d7dadbf5acc6222342c9a6592c74b..7b6258a44bebf4858ec217732df0f3d103482c62 100644 --- a/modules/common/CMakeLists.txt +++ b/modules/common/CMakeLists.txt @@ -10,7 +10,7 @@ if(BUILD_CELLFRAME_SDK_TESTS) add_subdirectory(tests) endif() -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_json-c) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto) target_include_directories(${PROJECT_NAME} PUBLIC include/ ) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../dap-sdk/3rdparty/json-c) diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c index 098ddeba453baf2c9cb8ca966cf134242da5040d..294cb43cf3d393e29c826f57dc143783d4deebbd 100644 --- a/modules/common/dap_chain_common.c +++ b/modules/common/dap_chain_common.c @@ -77,18 +77,6 @@ size_t dap_chain_hash_slow_to_str( dap_chain_hash_slow_t *a_hash, char *a_str, s return strlen(a_str); } -/** - * @brief dap_chain_addr_to_json - * @param a_addr - * @return - */ -json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr){ - char *l_addr_str = dap_chain_addr_to_str(a_addr); - json_object *l_obj = json_object_new_string(l_addr_str); - DAP_DELETE(l_addr_str); - return l_obj; -} - /** * @brief dap_chain_addr_to_str * @param a_addr diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index ccfc881503f24d18e70965bee016fb0b4ee3fc73..4fec72ab3cda6f4b634a94e635641b41b54fec82 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -788,30 +788,3 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c } DAP_DELETE(l_hash_str); } - -json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum){ - json_object *l_object = json_object_new_object(); - char *l_hash_data_str; - dap_get_data_hash_str_static(a_datum->data, a_datum->header.data_size, l_hash_data_str); - json_object *l_obj_data_hash = json_object_new_string(l_hash_data_str); - json_object *l_obj_version = json_object_new_int(a_datum->header.version_id); - json_object *l_obj_size = json_object_new_int(a_datum->header.data_size); - json_object *l_obj_ts_created = json_object_new_uint64(a_datum->header.ts_create); - json_object *l_obj_type = json_object_new_string(dap_chain_datum_type_id_to_str(a_datum->header.type_id)); - json_object *l_obj_data; - switch (a_datum->header.type_id) { - case DAP_CHAIN_DATUM_TX: - l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data); - break; - default: - l_obj_data = json_object_new_null(); - break; - } - json_object_object_add(l_object, "version", l_obj_version); - json_object_object_add(l_object, "hash", l_obj_data_hash); - json_object_object_add(l_object, "data_size", l_obj_size); - json_object_object_add(l_object, "ts_created", l_obj_ts_created); - json_object_object_add(l_object, "type", l_obj_type); - json_object_object_add(l_object, "data", l_obj_data); - return l_object; -} diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 78e9268f6cfe6ab99a056db72c191dafb6697641..0f2310fb974bf9ed1e37b7a1095171ed65497ea4 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -317,104 +317,3 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx) assert(tx_items_pos == tx_items_size); return ret; } - -json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){ - json_object *l_obj = json_object_new_object(); - json_object *l_obj_ts_created = json_object_new_uint64(a_tx->header.ts_created); - json_object *l_obj_items = json_object_new_array(); - uint32_t l_tx_items_count = 0; - uint32_t l_tx_items_size = a_tx->header.tx_items_size; - while(l_tx_items_count < l_tx_items_size) { - uint8_t *item = a_tx->tx_items + l_tx_items_count; - size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item); - if (l_tx_item_size == 0) { - json_object_put(l_obj_items); - l_obj_items = json_object_new_null(); - break; - } - dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(item); - json_object *l_obj_item_type = NULL, *l_obj_item_data = NULL; - switch (l_item_type) { - case TX_ITEM_TYPE_IN: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN"); - l_obj_item_data = dap_chain_datum_tx_item_in_to_json((dap_chain_tx_in_t*)item); - break; - case TX_ITEM_TYPE_OUT: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT"); - l_obj_item_data = dap_chain_datum_tx_item_out_to_json((dap_chain_tx_out_t*)item); - break; - case TX_ITEM_TYPE_IN_EMS: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_EMS"); - l_obj_item_data = dap_chain_datum_tx_item_in_ems_to_json((dap_chain_tx_in_ems_t*)item); - break; - case TX_ITEM_TYPE_SIG: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_SIG"); - l_obj_item_data = dap_chain_datum_tx_item_sig_to_json((dap_chain_tx_sig_t*)item); - break; - case TX_ITEM_TYPE_RECEIPT: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_RECEIPT"); - l_obj_item_data = dap_chain_datum_tx_receipt_to_json((dap_chain_datum_tx_receipt_t*)item); - break; - case TX_ITEM_TYPE_IN_COND: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_COND"); - l_obj_item_data = dap_chain_datum_tx_item_in_cond_to_json((dap_chain_tx_in_cond_t*)item); - break; - case TX_ITEM_TYPE_OUT_COND: - switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: - l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY"); - l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_pay_to_json((dap_chain_tx_out_cond_t*)item); - break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: - l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK"); - l_obj_item_data = dap_chain_net_srv_stake_lock_cond_out_to_json((dap_chain_tx_out_cond_t*)item); - break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: - l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE"); - l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_stake_to_json((dap_chain_tx_out_cond_t*)item); - break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: - l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE"); - l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_xchange_to_json((dap_chain_tx_out_cond_t*)item); - break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: - l_obj_item_type = json_object_new_string("DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE"); - l_obj_item_data = dap_chain_datum_tx_item_out_cond_fee_to_json((dap_chain_tx_out_cond_t*)item); - break; -// default: - } - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_COND"); - break; - case TX_ITEM_TYPE_OUT_EXT: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_EXT"); - l_obj_item_data = dap_chain_datum_tx_item_out_ext_to_json((dap_chain_tx_out_ext_t*)item); - break; - case TX_ITEM_TYPE_TSD: - l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_TSD"); - l_obj_item_data = dap_chain_datum_tx_item_tsd_to_json((dap_chain_tx_tsd_t*)item); - break; - default: { - char *l_hash_str; - dap_get_data_hash_str_static(a_tx, dap_chain_datum_tx_get_size(a_tx), l_hash_str); - log_it(L_NOTICE, "Transaction %s has an item whose type cannot be handled by the dap_chain_datum_tx_to_json function.", l_hash_str); - break; - } - } - if (!l_obj_item_type){ - json_object_array_add(l_obj_items, json_object_new_null()); - } else { - if (!l_obj_item_data) - l_obj_item_data = json_object_new_null(); - json_object *l_obj_item = json_object_new_object(); - json_object_object_add(l_obj_item, "type", l_obj_item_type); - json_object_object_add(l_obj_item, "data", l_obj_item_data); - json_object_array_add(l_obj_items, l_obj_item); - } - - l_tx_items_count += l_tx_item_size; - } - json_object_object_add(l_obj, "tsCrated", l_obj_ts_created); - json_object_object_add(l_obj, "items", l_obj_items); - return l_obj; -} - diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index e27960b2e989a47d177ec1b9f248e60a32513d3e..32803e8a9dcc4a33ee7c800c9094b5339f21936a 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -251,20 +251,6 @@ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_in_ems_create(dap_chain_id_t a_id return l_item; } -json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems) -{ - json_object *l_object = json_object_new_object(); - json_object *l_obj_ticker = json_object_new_string(a_in_ems->header.ticker); - json_object *l_obj_chain_id = json_object_new_uint64(a_in_ems->header.token_emission_chain_id.uint64); - char l_ehf[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(&a_in_ems->header.token_emission_hash, l_ehf, sizeof(l_ehf)); - json_object *l_obj_ehf = json_object_new_string(l_ehf); - json_object_object_add(l_object, "ticker", l_obj_ticker); - json_object_object_add(l_object, "chainId", l_obj_chain_id); - json_object_object_add(l_object, "emissionHash", l_obj_ehf); - return l_object; -} - /** * Create item dap_chain_tx_out_old_t * @@ -313,28 +299,6 @@ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type, return l_item; } -json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){ - json_object *l_obj_in = json_object_new_object(); - json_object *l_obj_prev_idx = json_object_new_uint64(a_in->header.tx_out_prev_idx); - char l_hash[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(&a_in->header.tx_prev_hash, l_hash, sizeof(l_hash)); - json_object *l_obj_hash = json_object_new_string(l_hash); - json_object_object_add(l_obj_in, "prev_idx", l_obj_prev_idx); - json_object_object_add(l_obj_in, "prev_hash", l_obj_hash); - return l_obj_in; -} - -json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd){ - json_object *l_object = json_object_new_object(); - json_object *l_obj_tsd_type = json_object_new_int(a_tsd->header.type); - json_object *l_obj_tsd_size = json_object_new_uint64(a_tsd->header.size); - json_object *l_obj_data = json_object_new_string_len((char *)a_tsd->tsd, a_tsd->header.size); - json_object_object_add(l_object, "type", l_obj_tsd_type); - json_object_object_add(l_object, "size", l_obj_tsd_size); - json_object_object_add(l_object, "data", l_obj_data); - return l_object; -} - /** * @brief dap_chain_datum_tx_item_in_cond_create * @param a_pkey_serialized @@ -358,24 +322,6 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa return l_item; } -json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond){ - json_object *l_obj = json_object_new_object(); - json_object *l_obj_receipt_idx = json_object_new_uint64(a_in_cond->header.receipt_idx); - json_object *l_obj_out_prev_idx = json_object_new_uint64(a_in_cond->header.tx_out_prev_idx); - json_object *l_obj_prev_hash = NULL; - if (dap_hash_fast_is_blank(&a_in_cond->header.tx_prev_hash)){ - l_obj_prev_hash = json_object_new_null(); - } else { - char *l_prev_hash = dap_hash_fast_to_str_new(&a_in_cond->header.tx_prev_hash); - l_obj_prev_hash = json_object_new_string(dap_strdup(l_prev_hash)); - DAP_DELETE(l_prev_hash); - } - json_object_object_add(l_obj, "receiptIdx", l_obj_receipt_idx); - json_object_object_add(l_obj, "outPrevIdx", l_obj_out_prev_idx); - json_object_object_add(l_obj, "txPrevHash", l_obj_prev_hash); - return l_obj; -} - /** * Create item dap_chain_tx_out_old_t * @@ -395,15 +341,6 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a return l_item; } -json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out) { - json_object *l_object = json_object_new_object(); - json_object *l_value = json_object_new_string(dap_chain_balance_print(a_out->header.value)); - json_object *l_addr = dap_chain_addr_to_json(&a_out->addr); - json_object_object_add(l_object, "value", l_value); - json_object_object_add(l_object, "addr", l_addr); - return l_object; -} - dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token) { if (!a_addr || !a_token) @@ -421,19 +358,6 @@ dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_a return l_item; } -json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext) { - json_object *l_obj = json_object_new_object(); - char *l_value = dap_chain_balance_print(a_out_ext->header.value); - json_object *l_obj_value = json_object_new_string(l_value); - DAP_DELETE(l_value); - json_object *l_obj_addr = dap_chain_addr_to_json(&a_out_ext->addr); - json_object *l_obj_token = json_object_new_string(a_out_ext->token); - json_object_object_add(l_obj, "value", l_obj_value); - json_object_object_add(l_obj, "addr", l_obj_addr); - json_object_object_add(l_obj, "token", l_obj_token); - return l_obj; -} - dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a_value) { if (IS_ZERO_256(a_value)) @@ -448,18 +372,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a return l_item; } -json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee){ - if (a_fee->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { - json_object *l_obj = json_object_new_object(); - char *l_balance = dap_chain_balance_print(a_fee->header.value); - json_object *l_obj_balance = json_object_new_string(l_balance); - DAP_DELETE(l_balance); - json_object_object_add(l_obj, "balance", l_obj_balance); - return l_obj; - } - return NULL; -} - /** * Create item dap_chain_tx_out_cond_t * @@ -492,33 +404,6 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke return l_item; } -json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *a_srv_pay) { - if (a_srv_pay->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY) { - json_object *l_obj = json_object_new_object(); - char *l_balance = dap_chain_balance_print(a_srv_pay->header.value); - json_object *l_obj_value = json_object_new_string(l_balance); - DAP_DELETE(l_balance); - json_object_object_add(l_obj, "value", l_obj_value); - json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_pay->header.srv_uid.uint64); - json_object_object_add(l_obj, "srvUid", l_obj_srv_uid); - json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_srv_pay->subtype.srv_pay.unit.enm)); - json_object_object_add(l_obj, "srvUnit", l_obj_units_type); - char *l_price_max_datoshi = dap_chain_balance_print(a_srv_pay->subtype.srv_pay.unit_price_max_datoshi); - json_object *l_obj_price_max_datoshi = json_object_new_string(l_price_max_datoshi); - DAP_DELETE(l_price_max_datoshi); - json_object_object_add(l_obj, "price", l_obj_price_max_datoshi); - char *l_pkeyHash = dap_hash_fast_to_str_new(&a_srv_pay->subtype.srv_pay.pkey_hash); - json_object *l_obj_pkey_hash = json_object_new_string(l_pkeyHash); - DAP_DELETE(l_pkeyHash); - json_object_object_add(l_obj, "pKeyHash", l_obj_pkey_hash); - //TODO: Parsing a_srv_pay->tsd -// json_object *l_obj_tsd = json_object_new_string_len(a_srv_pay->tsd, a_srv_pay->tsd_size); -// json_object_object_add(l_obj, "TSD", l_obj_tsd); - return l_obj; - } - return NULL; -} - dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap_chain_net_srv_uid_t a_srv_uid, dap_chain_net_id_t a_sell_net_id, uint256_t a_value_sell, dap_chain_net_id_t a_buy_net_id, const char *a_token, uint256_t a_value_rate, @@ -546,33 +431,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap return l_item; } -json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange){ - if (a_srv_xchange->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE){ - json_object *l_object = json_object_new_object(); - char *l_value = dap_chain_balance_print(a_srv_xchange->header.value); - json_object *l_obj_value = json_object_new_string(l_value); - DAP_DELETE(l_value); - json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_xchange->header.srv_uid.uint64); - json_object *l_obj_buy_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.buy_net_id); - json_object *l_obj_sell_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.sell_net_id); - json_object *l_obj_buy_token = json_object_new_string(a_srv_xchange->subtype.srv_xchange.buy_token); - char *l_value_rate = dap_chain_balance_print(a_srv_xchange->subtype.srv_xchange.rate); - json_object *l_obj_value_rate = json_object_new_string(l_value_rate); - DAP_DELETE(l_value_rate); - json_object *l_obj_seller_addr = dap_chain_addr_to_json(&a_srv_xchange->subtype.srv_xchange.seller_addr); - json_object_object_add(l_object, "value", l_obj_value); - json_object_object_add(l_object, "valueRate", l_obj_value_rate); - json_object_object_add(l_object, "srvUID", l_obj_srv_uid); - json_object_object_add(l_object, "buyNetId", l_obj_buy_net_id); - json_object_object_add(l_object, "sellNetId", l_obj_sell_net_id); - json_object_object_add(l_object, "buyToken", l_obj_buy_token); - json_object_object_add(l_object, "sellerAddr", l_obj_seller_addr); - //TODO: Parse TSD - return l_object; - } - return NULL; -} - dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_chain_net_srv_uid_t a_srv_uid, uint256_t a_value, dap_chain_addr_t *a_signing_addr, dap_chain_node_addr_t *a_signer_node_addr, dap_chain_addr_t *a_sovereign_addr, uint256_t a_sovereign_tax) @@ -599,28 +457,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c return l_item; } -json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake) { - if (a_srv_stake->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE) { - json_object *l_object = json_object_new_object(); - char *l_value = dap_chain_balance_print(a_srv_stake->header.value); - json_object *l_obj_value = json_object_new_string(l_value); - DAP_DELETE(l_value); - json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_stake->header.srv_uid.uint64); - json_object *l_obj_signing_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake_pos_delegate.signing_addr); - char *l_signer_node_addr = dap_strdup_printf( - NODE_ADDR_FP_STR, - NODE_ADDR_FP_ARGS_S(a_srv_stake->subtype.srv_stake_pos_delegate.signer_node_addr)); - json_object *l_obj_signer_node_addr = json_object_new_string(l_signer_node_addr); - DAP_DELETE(l_signer_node_addr); - json_object_object_add(l_object, "value", l_obj_value); - json_object_object_add(l_object, "srvUID", l_obj_srv_uid); - json_object_object_add(l_object, "signindAddr", l_obj_signing_addr); - json_object_object_add(l_object, "signerNodeAddr", l_obj_signer_node_addr); - return l_object; - } - return NULL; -} - /** * @brief dap_chain_net_srv_stake_lock_create_cond_out * @param a_key @@ -650,29 +486,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake_lock( return l_item; } -json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock) -{ - if (a_stake_lock->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) { - json_object *l_object = json_object_new_object(); - char *l_value = dap_chain_balance_print(a_stake_lock->header.value); - json_object *l_obj_value = json_object_new_string(l_value); - DAP_DELETE(l_value); - json_object *l_obj_srv_uid = json_object_new_uint64(a_stake_lock->header.srv_uid.uint64); - char *l_reinvest_precent = dap_chain_balance_print(a_stake_lock->subtype.srv_stake_lock.reinvest_percent); - json_object *l_obj_reinvest_percent = json_object_new_string(l_reinvest_precent); - DAP_DELETE(l_reinvest_precent); - json_object *l_obj_time_unlock = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.time_unlock); - json_object *l_obj_flags = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.flags); - json_object_object_add(l_object, "value", l_obj_value); - json_object_object_add(l_object, "srvUID", l_obj_srv_uid); - json_object_object_add(l_object, "reinvestPercent", l_obj_reinvest_percent); - json_object_object_add(l_object, "timeUnlock", l_obj_time_unlock); - json_object_object_add(l_object, "flags", l_obj_flags); - return l_object; - } - return NULL; -} - /** * Create item dap_chain_tx_sig_t * @@ -696,15 +509,6 @@ dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, co return l_tx_sig; } -json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig){ - json_object *l_object = json_object_new_object(); - json_object *l_sign_size = json_object_new_uint64(a_sig->header.sig_size); - json_object *l_sign = dap_sign_to_json((dap_sign_t*)a_sig->sig); - json_object_object_add(l_object, "signSize", l_sign_size); - json_object_object_add(l_object, "sign", l_sign); - return l_object; -} - /** * Get sign from sign item * diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c index 43e607dcec37cf65ca412dc32894f3b0214a074c..068bd365b83e2be92812e311cedf8c8d007b005a 100644 --- a/modules/common/dap_chain_datum_tx_receipt.c +++ b/modules/common/dap_chain_datum_tx_receipt.c @@ -160,42 +160,3 @@ uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * a log_it(L_ERROR, "Receipt 0x%zu (size=%zu) is corrupted", (size_t)a_receipt, a_receipt_size); return l_ret; } - - -json_object* dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info){ - json_object *l_obj = json_object_new_object(); - json_object *l_obj_srv_uid = json_object_new_uint64(a_info->srv_uid.uint64); - json_object_object_add(l_obj, "srvUID", l_obj_srv_uid); -#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 - json_object *l_obj_addition = json_object_new_uint64(a_info->addition); - json_object_object_add(l_obj, "addition", l_obj_addition); -#endif - json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_info->units_type.enm)); - json_object_object_add(l_obj, "unitsType", l_obj_units_type); - char *l_datoshi_value = dap_chain_balance_print(a_info->value_datoshi); - json_object *l_obj_datoshi = json_object_new_string(l_datoshi_value); - DAP_DELETE(l_datoshi_value); - json_object_object_add(l_obj, "value", l_obj_datoshi); - return l_obj; -} - -json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt) { - json_object *l_obj = json_object_new_object(); - json_object *l_obj_info = dap_chain_receipt_info_to_json(&a_receipt->receipt_info); - json_object *l_obj_size = json_object_new_uint64(a_receipt->size); - //Provider - dap_sign_t *l_first_sign = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 1); - //Client - dap_sign_t *l_second_sign = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 2); - json_object *l_obj_signs = json_object_new_object(); - json_object *l_obj_provider_sign = dap_sign_to_json(l_first_sign); - json_object *l_obj_client_sign = dap_sign_to_json(l_second_sign); - json_object_object_add(l_obj_signs, "provider", l_obj_provider_sign); - json_object_object_add(l_obj_signs, "client", l_obj_client_sign); - json_object *l_exts_data = json_object_new_string_len((char *)a_receipt->exts_n_signs, a_receipt->exts_size); - json_object_object_add(l_obj, "info", l_obj_info); - json_object_object_add(l_obj, "size", l_obj_size); - json_object_object_add(l_obj, "sings", l_obj_signs); - json_object_object_add(l_obj, "extsData", l_exts_data); - return l_obj; -} diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index ddef34874a871a6bea7b20ee5125e6ea6ddb6efd..fc2924bdfeb597c044e26b39fec7334282c5ec4f 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -216,14 +216,9 @@ extern "C" { size_t dap_chain_hash_slow_to_str(dap_chain_hash_slow_t * a_hash, char * a_str, size_t a_str_max); char* dap_chain_addr_to_str(const dap_chain_addr_t *a_addr); -json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr); dap_chain_addr_t* dap_chain_addr_from_str(const char *str); bool dap_chain_addr_is_blank(const dap_chain_addr_t *a_addr); -DAP_STATIC_INLINE json_object *dap_chain_net_id_to_json(dap_chain_net_id_t a_net_id) { - return json_object_new_uint64(a_net_id.uint64); -} - dap_chain_net_srv_uid_t dap_chain_net_srv_uid_from_str(const char* a_str); void dap_chain_addr_fill(dap_chain_addr_t *a_addr, dap_sign_type_t a_type, dap_chain_hash_fast_t *a_pkey_hash, dap_chain_net_id_t a_net_id); diff --git a/modules/json_rpc/CMakeLists.txt b/modules/json_rpc/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..526bc29d7597ec77286a5fbfc59ee15b9c307131 --- /dev/null +++ b/modules/json_rpc/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_subdirectory(mempool) +add_subdirectory(common) diff --git a/modules/json_rpc/common/CMakeLists.txt b/modules/json_rpc/common/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..4cd22f12205316ba754833b58898fb4fb6c748e0 --- /dev/null +++ b/modules/json_rpc/common/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.10) +project(dap_json_rpc_chain_common) + +file(GLOB DAP_JSON_RPC_CHAIN_COMMON_HEADERS include/*.h) +file(GLOB DAP_JSON_RPC_CHAIN_COMMON_SRCS *.c) + +add_library(${PROJECT_NAME} STATIC ${DAP_JSON_RPC_CHAIN_COMMON_SRCS} ${DAP_JSON_RPC_CHAIN_COMMON_HEADERS}) + +target_link_libraries(dap_json_rpc_chain_common dap_core dap_crypto dap_chain_common dap_json-c dap_json_rpc_core dap_json_rpc_crypto) +target_include_directories(dap_json_rpc_chain_common PUBLIC include/) diff --git a/modules/json_rpc/common/dap_json_rpc_chain_common.c b/modules/json_rpc/common/dap_json_rpc_chain_common.c new file mode 100644 index 0000000000000000000000000000000000000000..fbf2ed3eea23a0a840350eef8496c2b150a72a1e --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_common.c @@ -0,0 +1,24 @@ +#include "dap_json_rpc_chain_common.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_common" + +/** + * @brief dap_chain_addr_to_json + * @param a_addr + * @return + */ +json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr){ + char *l_addr_str = dap_chain_addr_to_str(a_addr); + if (!l_addr_str) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj = json_object_new_string(l_addr_str); + DAP_DELETE(l_addr_str); + if (!l_obj) { + dap_json_rpc_allocation_error; + return NULL; + } + return l_obj; +} diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum.c b/modules/json_rpc/common/dap_json_rpc_chain_datum.c new file mode 100644 index 0000000000000000000000000000000000000000..1590afbe227224db66fc16bfbb9d8bcd023d0c40 --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum.c @@ -0,0 +1,775 @@ + +#include "dap_common.h" +#include "dap_time.h" +#include "dap_chain_datum.h" +#include "dap_chain_datum_tx.h" +#include "dap_chain_datum_token.h" +#include "dap_chain_datum_tx_items.h" +#include "dap_chain_datum_decree.h" +#include "dap_chain_datum_anchor.h" +#include "dap_chain_datum_hashtree_roots.h" +#include "dap_enc_base58.h" + +#include "dap_json_rpc_chain_datum.h" +#include "dap_json_rpc_chain_datum_tx.h" +#include "dap_json_rpc_chain_datum_token.h" +#include "dap_json_rpc_chain_datum_anchor.h" +#include "dap_json_rpc_chain_datum_decree.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_datum" + +json_object *s_dap_chain_datum_token_tsd_to_json(dap_chain_datum_token_t *a_token, size_t a_token_size) { + dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(a_token, a_token_size); + if (l_tsd == NULL) { + json_object *l_tsd_wgn = json_object_new_object(); + if (!l_tsd_wgn){ + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_tsd_wgn_warning = json_object_new_string("<CORRUPTED TSD SECTION>"); + if (!l_tsd_wgn_warning) { + json_object_put(l_tsd_wgn); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_tsd_wgn, "warning", l_tsd_wgn_warning); + return l_tsd_wgn; + } + json_object *l_tsd_array = json_object_new_array(); + if (!l_tsd_array) { + dap_json_rpc_allocation_error; + return NULL; + } + size_t l_tsd_total_size = 0; + switch (a_token->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: + switch (a_token->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: + l_tsd_total_size = a_token->header_private_decl.tsd_total_size; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: + l_tsd_total_size = a_token->header_native_decl.tsd_total_size; break; + default: break; + } break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: + switch (a_token->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: + l_tsd_total_size = a_token->header_private_update.tsd_total_size; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: + l_tsd_total_size = a_token->header_native_update.tsd_total_size; break; + default: break; + } break; + default: break; + } + size_t l_tsd_size = 0; + for (size_t l_offset = 0; l_offset < l_tsd_total_size; l_offset += l_tsd_size) { + json_object *l_jobj_tsd = json_object_new_object(); + l_tsd = (dap_tsd_t *) (((byte_t*)l_tsd) + l_tsd_size); + l_tsd_size = l_tsd ? dap_tsd_size(l_tsd) : 0; + if (l_tsd_size == 0) { + json_object *l_wgn_text = json_object_new_string("Wrong zero TSD size, exiting s_datum_token_dump_tsd()"); + if (!l_wgn_text) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_wgn = json_object_new_object(); + if (!l_wgn) { + json_object_put(l_wgn_text); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_wgn, "error", l_wgn_text); + json_object_array_add(l_tsd_array, l_wgn); + break; + } else if (l_tsd_size+l_offset > l_tsd_total_size) { + char *l_wgn_str = dap_strdup_printf("<CORRUPTED TSD> too big size %u when left maximum %zu", + l_tsd->size, l_tsd_total_size - l_offset); + if (!l_wgn_str) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_wgn_text = json_object_new_string(l_wgn_str); + DAP_DELETE(l_wgn_str); + if (!l_wgn_text) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_wgn = json_object_new_object(); + if (!l_wgn) { + json_object_put(l_wgn_text); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_wgn, "error", l_wgn_text); + json_object_array_add(l_tsd_array, l_wgn); + break; + } + switch( l_tsd->type){ + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS: { + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + uint16_t l_flags = 0; + _dap_tsd_get_scalar(l_tsd, &l_flags); + json_object *l_jobj_tsd_flag = dap_chain_datum_token_flags_to_json(l_flags); + if (!l_jobj_tsd_flag) { + json_object_put(l_jobj_tsd_type); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "flags", l_jobj_tsd_flag); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS: { + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_UNSET_FLAGS"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + uint16_t l_flags = 0; + _dap_tsd_get_scalar(l_tsd, &l_flags); + json_object *l_jobj_tsd_flag = dap_chain_datum_token_flags_to_json(l_flags); + if (!l_jobj_tsd_flag) { + json_object_put(l_jobj_tsd_type); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "flags", l_jobj_tsd_flag); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY: { // 256 + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + uint256_t l_balance_native = uint256_0; + _dap_tsd_get_scalar(l_tsd, &l_balance_native); + char *l_balance = dap_chain_balance_print(l_balance_native); + if (!l_balance) { + json_object_put(l_jobj_tsd); + json_object_put(l_jobj_tsd_type); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_value = json_object_new_string(l_balance); + DAP_DELETE(l_balance); + if (!l_jobj_tsd_value) { + json_object_put(l_jobj_tsd); + json_object_put(l_jobj_tsd_type); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "value", l_jobj_tsd_value); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_OLD: {// 128 + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SUPPLY_OLD"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + uint128_t l_balance_native_old = uint128_0; + _dap_tsd_get_scalar(l_tsd, &l_balance_native_old); + char *l_balance = dap_chain_balance_print(GET_256_FROM_128(l_balance_native_old)); + if (!l_balance) { + json_object_put(l_jobj_tsd); + json_object_put(l_jobj_tsd_type); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_value = json_object_new_string(l_balance); + DAP_DELETE(l_balance); + if (!l_jobj_tsd_value) { + json_object_put(l_jobj_tsd_type); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "value", l_jobj_tsd_value); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_VALID"); + uint16_t l_flags = 0; + _dap_tsd_get_scalar(l_tsd, &l_flags); + json_object *l_jobj_value = json_object_new_uint64(l_flags); + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "total_signs_valid", l_jobj_value); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_ADD"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + if (l_tsd->size >= sizeof(dap_pkey_t)) { + dap_pkey_t *l_pkey = (dap_pkey_t *) l_tsd->data; + dap_hash_fast_t l_hf = {0}; + if (!dap_pkey_get_hash(l_pkey, &l_hf)) { + json_object *l_wgn_text = json_object_new_string("total_pkeys_add: <WRONG CALCULATION FINGERPRINT>"); + if (!l_wgn_text) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_wgn_text); + } else { + char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_hf); + if (!l_hash_str) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_hash = json_object_new_string(l_hash_str); + DAP_DELETE(l_hash_str); + if (l_jobj_hash) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "pkey", l_jobj_hash); + } + } else { + char *l_wgn_text = dap_strdup_printf("total_pkeys_add: <WRONG SIZE %u>\n", l_tsd->size); + if (!l_wgn_text) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_wgn_text = json_object_new_string(l_wgn_text); + DAP_DELETE(l_wgn_text); + if (!l_jobj_wgn_text) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn_text); + } + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd){ + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_PKEYS_REMOVE"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + 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); + if (!l_hash_str) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_hash = json_object_new_string(l_hash_str); + DAP_DELETE(l_hash_str); + if (!l_jobj_hash) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "pkey", l_jobj_hash); + } else { + char *l_wgn_text = dap_strdup_printf("total_pkeys_remove: <WRONG SIZE %u>\n", l_tsd->size); + if (!l_wgn_text) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_wgn_text = json_object_new_string(l_wgn_text); + DAP_DELETE(l_wgn_text); + if (!l_jobj_wgn_text) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn_text); + } + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK: { + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DELEGATE_EMISSION_FROM_STAKE_LOCK"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + dap_chain_datum_token_tsd_delegate_from_stake_lock_t *l_tsd_section = _dap_tsd_get_object(l_tsd, dap_chain_datum_token_tsd_delegate_from_stake_lock_t); + json_object *l_jobj_ticker_token_from = json_object_new_string((char*)l_tsd_section->ticker_token_from); + char *balance = dap_chain_balance_to_coins(l_tsd_section->emission_rate); + if (!l_jobj_ticker_token_from || !balance) { + json_object_put(l_jobj_ticker_token_from); + DAP_DEL_Z(balance); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "ticker_token_from", l_jobj_ticker_token_from); + json_object *l_jobj_emission_rate = json_object_new_string(balance); + DAP_DEL_Z(balance); + if (!l_jobj_emission_rate) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "emission_rate", l_jobj_emission_rate); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_ADD"); + if (!l_jobj_tsd_type) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object *l_jobj_datum_type_allowed_add = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_datum_type_allowed_add) { + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "datum_type_allowed_add", l_jobj_datum_type_allowed_add); + json_object_array_add(l_tsd_array, l_jobj_tsd); + }continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_ALLOWED_REMOVE"); + json_object *l_jobj_datum_type_allowed_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_datum_type_allowed_remove) { + json_object_put(l_jobj_datum_type_allowed_remove); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "datum_type_allowed_remove", l_jobj_datum_type_allowed_remove); + json_object_array_add(l_tsd_array, l_jobj_tsd); + }continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_ADD"); + json_object *l_jobj_datum_type_blocked_add = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_datum_type_blocked_add) { + json_object_put(l_jobj_datum_type_blocked_add); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "datum_type_blocked_add", l_jobj_datum_type_blocked_add); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_DATUM_TYPE_BLOCKED_REMOVE"); + json_object *l_jobj_datum_type_blocked_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_datum_type_blocked_remove) { + json_object_put(l_jobj_datum_type_blocked_remove); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "datum_type_blocked_remove", l_jobj_datum_type_blocked_remove); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD"); + json_object *l_jobj_tx_sender_allowed_add = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_allowed_add) { + json_object_put(l_jobj_tx_sender_allowed_add); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_sender_allowed_add",l_jobj_tx_sender_allowed_add); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_REMOVE"); + json_object *l_jobj_tx_sender_allowed_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_allowed_remove) { + json_object_put(l_jobj_tx_sender_allowed_remove); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_sender_allowed_remove",l_jobj_tx_sender_allowed_remove); + json_object_array_add(l_tsd_array, l_jobj_tsd); + }continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_ADD"); + json_object *l_jobj_tx_sender_blocked_add = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_blocked_add) { + json_object_put(l_jobj_tx_sender_blocked_add); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_sender_blocked_add", l_jobj_tx_sender_blocked_add); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE"); + json_object *l_jobj_tx_sender_blocked_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_sender_blocked_remove) { + json_object_put(l_jobj_tx_sender_blocked_remove); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_sender_blocked_remove", l_jobj_tx_sender_blocked_remove); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_ADD"); + json_object *l_tx_receiver_allowed_add = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_tx_receiver_allowed_add) { + json_object_put(l_tx_receiver_allowed_add); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_receiver_allowed_add", l_tx_receiver_allowed_add); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_ALLOWED_REMOVE"); + json_object *l_jobj_tx_receiver_allowed_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_receiver_allowed_remove){ + json_object_put(l_jobj_tx_receiver_allowed_remove); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_receiver_allowed_remove", l_jobj_tx_receiver_allowed_remove); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_ADD"); + json_object *l_jobj_tx_receiver_blocked_add = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_receiver_blocked_add){ + json_object_put(l_jobj_tx_receiver_blocked_add); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_receiver_blocked_add", l_jobj_tx_receiver_blocked_add); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE: { + json_object *l_jobj_tsd = json_object_new_object(); + json_object *l_jobj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_RECEIVER_BLOCKED_REMOVE"); + json_object *l_jobj_tx_receiver_blocked_remove = json_object_new_string(dap_tsd_get_string_const(l_tsd)); + if (!l_jobj_tsd || !l_jobj_tsd_type || !l_jobj_tx_receiver_blocked_remove) { + json_object_put(l_jobj_tx_receiver_blocked_remove); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_jobj_tsd_type); + json_object_object_add(l_jobj_tsd, "tx_receiver_blocked_remove", l_jobj_tx_receiver_blocked_remove); + json_object_array_add(l_tsd_array, l_jobj_tsd); + } continue; + default: { + char *l_wgn_text = dap_strdup_printf("<0x%04hX>: <size %u>\n", l_tsd->type, l_tsd->size); + if (!l_wgn_text){ + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_wgn_text = json_object_new_string(l_wgn_text); + DAP_DELETE(l_wgn_text); + json_object *l_jobj_warning = json_object_new_object(); + if (!l_jobj_wgn_text || !l_jobj_warning) { + json_object_put(l_jobj_wgn_text); + json_object_put(l_jobj_warning); + json_object_put(l_jobj_tsd); + json_object_put(l_tsd_array); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_warning, "warning", l_jobj_wgn_text); + json_object_array_add(l_tsd_array, l_jobj_warning); + } + } + } + return l_tsd_array; +} + +typedef enum dap_chain_datum_to_json_err_list { + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TX_TO_JSON = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECL_TO_JSON, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_DECL, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TSD_SECTION_DECL_TO_JSON, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_EMISSION_TO_JSON, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_EMISSION, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_ANCHOR_TO_JSON, + CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECREE_TO_JSON +}dap_chain_datum_to_json_err_list_t; + +json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum){ + json_object *l_object = json_object_new_object(); + if (!l_object){ + dap_json_rpc_allocation_error; + return NULL; + } + char *l_hash_data_str; + dap_get_data_hash_str_static(a_datum->data, a_datum->header.data_size, l_hash_data_str); + json_object *l_obj_data_hash = json_object_new_string(l_hash_data_str); + if (!l_obj_data_hash) { + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_version = json_object_new_int(a_datum->header.version_id); + if (!l_obj_version) { + json_object_put(l_object); + json_object_put(l_obj_data_hash); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_size = json_object_new_int(a_datum->header.data_size); + if (!l_obj_size) { + json_object_put(l_object); + json_object_put(l_obj_data_hash); + json_object_put(l_obj_version); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_type = json_object_new_string(dap_chain_datum_type_id_to_str(a_datum->header.type_id)); + if (!l_obj_type) { + json_object_put(l_object); + json_object_put(l_obj_data_hash); + json_object_put(l_obj_version); + json_object_put(l_obj_size); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_data = dap_chain_datum_data_to_json(a_datum); + + json_object_object_add(l_object, "hash", l_obj_data_hash); + json_object_object_add(l_object, "data_size", l_obj_size); + json_object_object_add(l_object, "version", l_obj_version); + + char l_time_str[32]; + if (a_datum->header.ts_create) { + uint64_t l_ts = a_datum->header.ts_create; + dap_ctime_r(&l_ts, l_time_str); /* Convert ts to "Sat May 17 01:17:08 2014\n" */ + l_time_str[strlen(l_time_str)-1] = '\0'; /* Remove "\n"*/ + } + json_object *l_obj_ts_created = json_object_new_string(l_time_str); + json_object_object_add(l_object, "ts_create", l_obj_ts_created); + json_object_object_add(l_object, "type", l_obj_type); + if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) { + json_object_object_add(l_object, "items", l_obj_data); + } else { + json_object_object_add(l_object, "data", l_obj_data); + } + return l_object; +} + +json_object * dap_chain_datum_data_to_json(dap_chain_datum_t *a_datum) { + if (!a_datum) + return json_object_new_null(); + json_object *l_obj_data; + switch (a_datum->header.type_id) { + case DAP_CHAIN_DATUM_TX: + l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data); + if (!l_obj_data) { + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TX_TO_JSON, + "Can't convert DAP_CHAIN_DATUM_TX to JSON"); + return NULL; + } + break; + case DAP_CHAIN_DATUM_DECREE: + l_obj_data = dap_chain_datum_decree_to_json((dap_chain_datum_decree_t*)a_datum->data); + if (!l_obj_data) { + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECREE_TO_JSON, + "Can't convert DAP_CHAIN_DATUM_DECREE to JSON"); + return NULL; + } + break; + case DAP_CHAIN_DATUM_ANCHOR: + l_obj_data = dap_chain_datum_anchor_to_json((dap_chain_datum_anchor_t*)a_datum->data); + if (!l_obj_data) { + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_ANCHOR_TO_JSON, + "Can't convert DAP_CHAIN_DATUM_ANCHOR to JSON"); + return NULL; + } + break; + case DAP_CHAIN_DATUM_TOKEN_DECL: { + size_t l_token_size = a_datum->header.data_size; + dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(a_datum->data, &l_token_size); + if (!l_token) { + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_DECL, + "The contents of the token delcaration could not be read."); + return NULL; + } + l_obj_data = dap_chain_datum_token_to_json(l_token, l_token_size); + if (!l_obj_data) { + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_DECL_TO_JSON, + "Can't convert DAP_CHAIN_DATUM_TOKEN_DECL to JSON"); + DAP_DELETE(l_token); + return NULL; + } + json_object *l_obj_tsd_data = s_dap_chain_datum_token_tsd_to_json(l_token, l_token_size); + if (!l_obj_tsd_data) { + json_object_put(l_obj_data); + DAP_DELETE(l_token); + log_it(L_ERROR, "It was not possible to read the contents of the TSD sections of the token delcaration."); + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TSD_SECTION_DECL_TO_JSON, + "It was not possible to read the contents of the TSD sections of the token delcaration."); + return NULL; + } + json_object_object_add(l_obj_data, "TSD", l_obj_tsd_data); + DAP_DELETE(l_token); + } break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION: { + size_t l_emission_size = a_datum->header.data_size; + dap_chain_datum_token_emission_t *l_emission = dap_chain_datum_emission_read(a_datum->data, &l_emission_size); + if (l_emission_size == 0 || !l_emission) { + log_it(L_ERROR, "Failed to read emission"); + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_READ_EMISSION, + "Failed to read emission."); + return NULL; + } else { + l_obj_data = dap_chain_datum_emission_to_json(l_emission, l_emission_size); + DAP_DELETE(l_emission); + if (!l_obj_data) { + dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_EMISSION_TO_JSON, + "Can't convert DAP_CHAIN_DATUM_TOKEN_DECL to JSON"); + return NULL; + } + } + } break; + default: + l_obj_data = json_object_new_null(); + break; + } + return l_obj_data; +} diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_anchor.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_anchor.c new file mode 100644 index 0000000000000000000000000000000000000000..2147a1d93718c77e3bfa2209fd22249024fbdbbf --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_anchor.c @@ -0,0 +1,171 @@ +#include "dap_json_rpc_chain_datum_anchor.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_datum_anchor" + + +json_object *s_dap_chain_datum_anchor_sign_to_json(byte_t * a_signs, size_t a_certs_size) { + json_object *l_jobs_signs = json_object_new_array(); + size_t l_offset = 0; + for (int i = 1; l_offset < (a_certs_size); i++) { + json_object *l_jobj_sign = json_object_new_object(); + dap_sign_t *l_sign = (dap_sign_t*)(a_signs + l_offset); + l_offset += dap_sign_get_size(l_sign); + if (l_sign->header.sign_size == 0) { + json_object *l_wrn_text = json_object_new_string("<CORRUPTED - 0 size signature>"); + json_object_object_add(l_jobj_sign, "warning", l_wrn_text); + continue; + } + + dap_chain_hash_fast_t l_pkey_hash = {0}; + if (dap_sign_get_pkey_hash(l_sign, &l_pkey_hash) == false) { + json_object *l_wrn_text = json_object_new_string("<CORRUPTED - can't calc hash>"); + json_object_object_add(l_jobj_sign, "warning", l_wrn_text); + continue; + } + char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); + json_object *l_jobj_hash_str = json_object_new_string(l_hash_str); + json_object *l_jobj_type_str = json_object_new_string(dap_sign_type_to_str(l_sign->header.type)); + json_object *l_jobj_sign_size = json_object_new_uint64(l_sign->header.sign_size); + json_object_object_add(l_jobj_sign, "hash", l_jobj_hash_str); + json_object_object_add(l_jobj_sign, "type", l_jobj_type_str); + json_object_object_add(l_jobj_sign, "size", l_jobj_sign_size); + DAP_DEL_Z(l_hash_str); + json_object_array_add(l_jobs_signs, l_jobj_sign); + } + return l_jobs_signs; +} + +json_object *dap_chain_datum_anchor_to_json(dap_chain_datum_anchor_t *a_anchor){ + json_object *l_obj_anchor = json_object_new_object(); + if (!l_obj_anchor) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_version = json_object_new_uint64(a_anchor->anchor_version); + if (!l_obj_version){ + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_ts_created = json_object_new_uint64(a_anchor->header.ts_created); + if (!l_obj_ts_created) { + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_tsd_array = json_object_new_array(); + if(!l_obj_tsd_array) { + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + size_t l_tsd_offset = 0, tsd_data_size = a_anchor->header.data_size; + + while(l_tsd_offset < tsd_data_size){ + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + dap_tsd_t *l_tsd = (dap_tsd_t*)a_anchor->data_n_sign + l_tsd_offset; + size_t l_tsd_size = l_tsd->size + sizeof(dap_tsd_t); + if(l_tsd_size > tsd_data_size){ + json_object *l_jobj_wgn = json_object_new_string("TSD size is greater than all data size. It's possible corrupt data."); + if (!l_jobj_wgn){ + json_object_put(l_jobj_tsd); + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn); + json_object_array_add(l_obj_tsd_array, l_jobj_tsd); + break; + } + if (l_tsd->type == DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH){ + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH"); + if (!l_obj_tsd_type){ + json_object_put(l_jobj_tsd); + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if(l_tsd->size > sizeof(dap_hash_fast_t)){ + json_object *l_jobj_wgn = json_object_new_string("Wrong fee tsd data size."); + if (!l_jobj_wgn){ + json_object_put(l_jobj_tsd); + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_jobj_wgn); + json_object_array_add(l_obj_tsd_array, l_jobj_tsd); + break; + } + dap_hash_fast_t l_out_hash = {0}; + _dap_tsd_get_scalar(l_tsd, &l_out_hash); + char *l_hash_str = dap_hash_fast_to_str_new(&l_out_hash); + if (!l_hash_str) { + json_object_put(l_jobj_tsd); + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_tsd_hash = json_object_new_string(l_hash_str); + DAP_DELETE(l_hash_str); + if (!l_obj_tsd_hash){ + json_object_put(l_jobj_tsd); + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "hash", l_obj_tsd_hash); + } + json_object_array_add(l_obj_tsd_array, l_jobj_tsd); + l_tsd_offset += l_tsd_size; + } + json_object_object_add(l_obj_anchor, "version", l_obj_version); + json_object_object_add(l_obj_anchor, "ts_created", l_obj_ts_created); + json_object_object_add(l_obj_anchor, "TSD", l_obj_tsd_array); + json_object *l_jobj_signs = s_dap_chain_datum_anchor_sign_to_json(a_anchor->data_n_sign + a_anchor->header.data_size, + a_anchor->header.signs_size); + if (!l_jobj_signs) { + json_object_put(l_obj_tsd_array); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_ts_created); + json_object_put(l_obj_version); + json_object_put(l_obj_anchor); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "I can't serialize the anchor signature in JSON."); + return NULL; + } + json_object_object_add(l_obj_anchor, "signs", l_jobj_signs); + return l_obj_anchor; +} diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_decree.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_decree.c new file mode 100644 index 0000000000000000000000000000000000000000..2fba615b5ef0c5dc789355289bb6a5c62c332120 --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_decree.c @@ -0,0 +1,668 @@ + +#include "dap_json_rpc_chain_datum_decree.h" +#include "json.h" + + +#define LOG_TAG "dap_json_rpc_chain_datum_decree" + +json_object *s_dap_chain_datum_decree_certs_dump_json(byte_t * a_signs, size_t a_certs_size){ + json_object *l_jobj_signatures = json_object_new_array(); + if (!l_jobj_signatures) { + dap_json_rpc_allocation_error; + return NULL; + } + size_t l_offset = 0; + for (int i = 1; l_offset < (a_certs_size); i++) { + json_object *l_jobj_signature = json_object_new_object(); + if (!l_jobj_signature) { + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + dap_sign_t *l_sign = (dap_sign_t *) (a_signs + l_offset); + l_offset += dap_sign_get_size(l_sign); + if (l_sign->header.sign_size == 0) { + json_object *l_wrn_text = json_object_new_string("<CORRUPTED - 0 size signature>"); + if(!l_wrn_text) { + json_object_put(l_jobj_signature); + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_signature, "warning", l_wrn_text); + continue; + } + + dap_chain_hash_fast_t l_pkey_hash = {0}; + if (dap_sign_get_pkey_hash(l_sign, &l_pkey_hash) == false) { + json_object *l_wrn_text = json_object_new_string("<CORRUPTED - can't calc hash>"); + if (!l_wrn_text){ + json_object_put(l_jobj_signature); + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_signature, "warning", l_wrn_text); + continue; + } + + char *l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); + if (!l_hash_str) { + json_object_put(l_jobj_signature); + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_hash_str = json_object_new_string(l_hash_str); + if (!l_jobj_hash_str) { + DAP_DEL_Z(l_hash_str); + json_object_put(l_jobj_signature); + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_type_str = json_object_new_string(dap_sign_type_to_str(l_sign->header.type)); + if (!l_jobj_type_str) { + json_object_put(l_jobj_hash_str); + json_object_put(l_jobj_signature); + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_sign_size = json_object_new_uint64(l_sign->header.sign_size); + if (!l_jobj_sign_size) { + json_object_put(l_jobj_hash_str); + json_object_put(l_jobj_type_str); + json_object_put(l_jobj_signature); + json_object_put(l_jobj_signatures); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DEL_Z(l_hash_str); + json_object_object_add(l_jobj_signature, "hash", l_jobj_hash_str); + json_object_object_add(l_jobj_signature, "type", l_jobj_type_str); + json_object_object_add(l_jobj_signature, "size", l_jobj_sign_size); + json_object_array_add(l_jobj_signatures, l_jobj_signature); + } + return l_jobj_signatures; +} + +json_object *dap_chain_datum_decree_to_json(dap_chain_datum_decree_t *a_decree){ + json_object *l_jobj_decree = json_object_new_object(); + if (!l_jobj_decree) { + dap_json_rpc_allocation_error; + return NULL; + } + char *l_type_str = ""; + switch(a_decree->header.type) + { + case DAP_CHAIN_DATUM_DECREE_TYPE_COMMON: + l_type_str = "DECREE_TYPE_COMMON"; + break; + case DAP_CHAIN_DATUM_DECREE_TYPE_SERVICE: + l_type_str = "DECREE_TYPE_SERVICE"; + break; + default: + l_type_str = "DECREE_TYPE_UNKNOWN"; + } + json_object *l_jobj_type = json_object_new_string(l_type_str); + if (!l_jobj_type) { + json_object_put(l_jobj_decree); + dap_json_rpc_allocation_error; + return NULL; + } + const char *l_subtype_str = dap_chain_datum_decree_subtype_to_str(a_decree->header.sub_type); + json_object *l_json_subtype = json_object_new_string(l_subtype_str); + if (!l_json_subtype) { + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_json_tsd_array = json_object_new_array(); + if (!l_json_tsd_array){ + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + dap_json_rpc_allocation_error; + return NULL; + } + for (size_t l_offset = 0; l_offset < a_decree->header.data_size;) { + dap_tsd_t *l_tsd = (dap_tsd_t *)((byte_t*)a_decree->data_n_signs + l_offset); + l_offset += dap_tsd_size(l_tsd); + json_object *l_jobj_tsd = json_object_new_object(); + if (!l_jobj_tsd) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + dap_json_rpc_allocation_error; + return NULL; + } + switch(l_tsd->type) { + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN"); + if (!l_obj_tsd_type) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE"); + if (!l_obj_tsd_type) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(uint256_t)) { + json_object *l_text_wgn = json_object_new_string("Fee: <WRONG SIZE>"); + if (!l_text_wgn) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + uint256_t l_fee_value = uint256_0; + _dap_tsd_get_scalar(l_tsd, &l_fee_value); + char *l_fee_value_str = dap_chain_balance_print(l_fee_value); + if (!l_fee_value_str) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_fee = json_object_new_string(l_fee_value_str); + DAP_DELETE(l_fee_value_str); + if (!l_jobj_fee) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "value", l_jobj_fee); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER"); + if (!l_obj_tsd_type){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size < sizeof(dap_pkey_t)) { + json_object *l_text_wgn = json_object_new_string("Owner fingerprint: <WRONG SIZE>"); + if (!l_text_wgn){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + dap_pkey_t *l_owner_pkey = DAP_NEW_Z_SIZE(dap_pkey_t, l_tsd->size); + if(!l_owner_pkey) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + memcpy(l_owner_pkey, l_tsd->data, l_tsd->size); + dap_hash_fast_t l_owner_pkey_hash = {0}; + dap_hash_fast(l_owner_pkey->pkey, l_owner_pkey->header.size, &l_owner_pkey_hash); + char l_owner_pkey_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_owner_pkey_hash, l_owner_pkey_str, sizeof(l_owner_pkey_str)); + json_object *l_jobj_owner_pkey = json_object_new_string(l_owner_pkey_str); + if (!l_jobj_owner_pkey) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "owner_fingerprint", l_jobj_owner_pkey); + DAP_DELETE(l_owner_pkey); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER"); + if (!l_obj_tsd_type){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(uint256_t)){ + json_object *l_text_wgn = json_object_new_string("Owner min: <WRONG SIZE>"); + if (!l_text_wgn) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + uint256_t l_owner_min = {0}; + _dap_tsd_get_scalar(l_tsd, &l_owner_min); + char *l_owner_min_str = dap_chain_balance_print(l_owner_min); + if (!l_owner_min_str) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_owner_min = json_object_new_string(l_owner_min_str); + if (!l_jobj_owner_min) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "owner_min", l_jobj_owner_min); + DAP_DELETE(l_owner_min_str); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET"); + if (!l_obj_tsd_type) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(dap_chain_addr_t)) { + json_object *l_text_wgn = json_object_new_string("Wallet for fee: <WRONG SIZE>"); + if (!l_text_wgn) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + dap_chain_addr_t l_addr_fee_wallet = {0}; + _dap_tsd_get_scalar(l_tsd, &l_addr_fee_wallet); + char *l_addr_fee_wallet_str = dap_chain_addr_to_str(&l_addr_fee_wallet); + if (!l_addr_fee_wallet_str) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_ADDR_TO_JSON, + "Failed to serialize address to JSON."); + return NULL; + } + json_object *l_jobj_addr_fee_wallet = json_object_new_string(l_addr_fee_wallet_str); + DAP_DELETE(l_addr_fee_wallet_str); + if (!l_jobj_addr_fee_wallet) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "addr", l_jobj_addr_fee_wallet); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_TX_HASH: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_TX_HASH"); + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(dap_hash_fast_t)) { + json_object *l_text_wgn = json_object_new_string("Stake tx: <WRONG SIZE>"); + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + dap_hash_fast_t l_stake_tx = {0}; + _dap_tsd_get_scalar(l_tsd, &l_stake_tx); + char *l_stake_tx_hash = dap_chain_hash_fast_to_str_new(&l_stake_tx); + if (!l_stake_tx_hash) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_tx_hash = json_object_new_string(l_stake_tx_hash); + DAP_DELETE(l_stake_tx_hash); + if (!l_jobj_tx_hash) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "hash", l_jobj_tx_hash); +// char *l_stake_tx_hash = dap_strcmp(a_hash_out_type, "hex") +// ? dap_enc_base58_encode_hash_to_str(&l_stake_tx) +// : dap_chain_hash_fast_to_str_new(&l_stake_tx); +// dap_string_append_printf(a_str_out, "\tStake tx: %s\n", l_stake_tx_hash); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE"); + if (!l_obj_tsd_type){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(uint256_t)) { + json_object *l_text_wgn = json_object_new_string("Stake value: <WRONG SIZE>"); + if (!l_text_wgn){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + uint256_t l_stake_value = uint256_0; + _dap_tsd_get_scalar(l_tsd, &l_stake_value); + char *l_stake_value_str = dap_chain_balance_print(l_stake_value); + if (!l_stake_value_str) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_stake_value = json_object_new_string(l_stake_value_str); + DAP_DELETE(l_stake_value_str); + if (!l_jobj_stake_value){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "value", l_jobj_stake_value); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR: { + json_object *l_obj_tsd_type = json_object_new_string("DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR"); + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(dap_chain_addr_t)) { + json_object *l_text_wgn = json_object_new_string("Signing addr: <WRONG SIZE>"); + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + dap_chain_addr_t l_stake_addr_signing = {0}; + _dap_tsd_get_scalar(l_tsd, &l_stake_addr_signing); + char *l_stake_addr_signing_str = dap_chain_addr_to_str(&l_stake_addr_signing); +// dap_string_append_printf(a_str_out, "\tSigning addr: %s\n", l_stake_addr_signing_str); + dap_chain_hash_fast_t *l_pkey_signing = DAP_NEW(dap_chain_hash_fast_t); + if (!l_pkey_signing) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + memcpy(l_pkey_signing, l_stake_addr_signing.data.key, sizeof(dap_chain_hash_fast_t)); + char *l_pkey_signing_str = dap_chain_hash_fast_to_str_new(l_pkey_signing); + if (!l_pkey_signing_str){ + DAP_DELETE(l_pkey_signing); + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_stake_addr_signing = json_object_new_string(l_stake_addr_signing_str); + if (!l_jobj_stake_addr_signing) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_pkey_signing = json_object_new_string(l_pkey_signing_str); + if (!l_jobj_pkey_signing) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "addr", l_jobj_stake_addr_signing); + json_object_object_add(l_jobj_tsd, "pkey", l_jobj_pkey_signing); +// char *l_pkey_signing_str = dap_strcmp(a_hash_out_type, "hex") +// ? dap_enc_base58_encode_hash_to_str(l_pkey_signing) +// : dap_chain_hash_fast_to_str_new(l_pkey_signing); +// dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str); + DAP_DELETE(l_stake_addr_signing_str); + DAP_DELETE(l_pkey_signing_str); + DAP_DELETE(l_pkey_signing); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNER_NODE_ADDR: { + json_object *l_obj_tsd_type = json_object_new_string( + "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNER_NODE_ADDR"); + if (!l_obj_tsd_type) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if(l_tsd->size > sizeof(dap_chain_node_addr_t)){ + json_object *l_text_wgn = json_object_new_string("Node addr: <WRONG SIZE>"); + if (!l_text_wgn){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + dap_chain_node_addr_t l_node_addr = {0}; + _dap_tsd_get_scalar(l_tsd, &l_node_addr); + char *l_node_addr_str = dap_strdup_printf(NODE_ADDR_FP_STR,NODE_ADDR_FP_ARGS_S(l_node_addr)); + if (!l_node_addr_str) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_node_addr = json_object_new_string(l_node_addr_str); + DAP_DELETE(l_node_addr_str); + if (!l_jobj_node_addr){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "node", l_jobj_node_addr); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE: { + json_object *l_obj_tsd_type = json_object_new_string( + "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE"); + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(uint256_t)) { + json_object *l_text_wgn = json_object_new_string("Min value: <WRONG SIZE>"); + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + uint256_t l_min_value = uint256_0; + _dap_tsd_get_scalar(l_tsd, &l_min_value); + char *l_min_value_str = dap_chain_balance_print(l_min_value); + json_object *l_jobj_min_value = json_object_new_string(l_min_value_str); + json_object_object_add(l_jobj_tsd, "value", l_jobj_min_value); + DAP_DELETE(l_min_value_str); + } break; + case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT: { + json_object *l_obj_tsd_type = json_object_new_string( + "DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT"); + if (!l_obj_tsd_type) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + if (l_tsd->size > sizeof(uint256_t)) { + json_object *l_text_wgn = json_object_new_string("Min signers count: <WRONG SIZE>"); + if(!l_text_wgn){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "warning", l_text_wgn); + break; + } + uint256_t l_min_signers_count = uint256_0; + _dap_tsd_get_scalar(l_tsd, &l_min_signers_count); + char *l_min_signers_count_str = dap_chain_balance_print(l_min_signers_count); + if (!l_min_signers_count_str) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_min_signers_count = json_object_new_string(l_min_signers_count_str); + if (!l_jobj_min_signers_count) { + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DELETE(l_min_signers_count_str); + json_object_object_add(l_jobj_tsd, "count", l_jobj_min_signers_count); + } break; + default: { + json_object *l_obj_tsd_type = json_object_new_string( + "<UNKNOWN_TYPE_TSD_SECTION>"); + if (!l_obj_tsd_type){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + json_object_put(l_jobj_tsd); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_tsd, "type", l_obj_tsd_type); + } break; + } + json_object_array_add(l_json_tsd_array, l_jobj_tsd); + } + json_object *l_jobj_signs = s_dap_chain_datum_decree_certs_dump_json(a_decree->data_n_signs + a_decree->header.data_size, + a_decree->header.signs_size); + if (!l_jobj_signs){ + json_object_put(l_json_tsd_array); + json_object_put(l_json_subtype); + json_object_put(l_jobj_type); + json_object_put(l_jobj_decree); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "Can't serialize the decree signature in JSON."); + return NULL; + } + json_object_object_add(l_jobj_decree, "type", l_jobj_type); + json_object_object_add(l_jobj_decree, "subtype", l_json_subtype); + json_object_object_add(l_jobj_decree, "TSD", l_json_tsd_array); + json_object_object_add(l_jobj_decree, "signs", l_jobj_signs); + return l_jobj_decree; +} diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c new file mode 100644 index 0000000000000000000000000000000000000000..4178f41b2ac58e470d4b416ce63f7fcf63b575a4 --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_token.c @@ -0,0 +1,388 @@ + + +#include "dap_json_rpc_chain_datum_token.h" +#include "dap_json_rpc_chain_common.h" +#include "dap_json_rpc_sign.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_datum_token" + +json_object *dap_chain_datum_token_flags_to_json(uint16_t a_flags){ + if (!a_flags) { + return json_object_new_null(); + } + json_object *l_jobj_flags = json_object_new_array(); + for (uint16_t i = 0; BIT(i) <= DAP_CHAIN_DATUM_TOKEN_FLAG_MAX; i++){ + if(a_flags & (1 << i)){ + json_object *l_jobj_flag_txt = json_object_new_string(c_dap_chain_datum_token_flag_str[BIT(i)]); + json_object_array_add(l_jobj_flags, l_jobj_flag_txt); + } + } + return l_jobj_flags; +} + + +json_object *dap_chain_datum_token_to_json(dap_chain_datum_token_t * a_token, size_t a_token_size){ + json_object *l_jobj_token = json_object_new_object(); + if (!l_jobj_token){ + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_type; + json_object *l_jobj_version = json_object_new_uint64(a_token->version); + if (!l_jobj_version) { + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + switch (a_token->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: + l_jobj_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TYPE_DECL"); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: + l_jobj_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE"); + break; + default: + l_jobj_type = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_TYPE_UNKNOWN"); + break; + } + if (!l_jobj_type) { + json_object_put(l_jobj_version); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_token, "version", l_jobj_version); + json_object_object_add(l_jobj_token, "type", l_jobj_type); + json_object *l_jobj_subtype = NULL; + json_object *l_jobj_header = json_object_new_object(); + if (!l_jobj_header){ + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + size_t l_tsd_total_size = 0; + switch (a_token->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: { + json_object *l_jobj_decimals = json_object_new_uint64(a_token->header_simple.decimals); + if (!l_jobj_decimals){ + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_header, "decimals", l_jobj_decimals); + l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE"); + }break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: { + json_object *l_jobj_flags = NULL; + json_object *l_jobj_decimals = NULL; + if (a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_DECL) { + l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_private_decl.flags)); + if (!l_jobj_flags){ + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_jobj_decimals = json_object_new_uint64(a_token->header_private_decl.decimals); + if (!l_jobj_decimals) { + json_object_put(l_jobj_flags); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_tsd_total_size = a_token->header_private_decl.tsd_total_size; + } else { + l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_private_update.flags)); + if (!l_jobj_flags) { + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_jobj_decimals = json_object_new_uint64(a_token->header_private_update.decimals); + if (!l_jobj_decimals) { + json_object_put(l_jobj_flags); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_tsd_total_size = a_token->header_private_update.tsd_total_size; + } + json_object_object_add(l_jobj_header, "flags", l_jobj_flags); + json_object_object_add(l_jobj_header, "decimals", l_jobj_decimals); + l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE"); + } break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: { + json_object *l_jobj_flags = NULL; + json_object *l_jobj_decimals = NULL; + if (a_token->type == DAP_CHAIN_DATUM_TOKEN_TYPE_DECL) { + l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_native_decl.flags)); + if (!l_jobj_flags) { + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_jobj_decimals = json_object_new_uint64(a_token->header_native_decl.decimals); + if (!l_jobj_decimals){ + json_object_put(l_jobj_flags); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_tsd_total_size = a_token->header_native_decl.tsd_total_size; + } else { + l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_native_update.flags)); + if (!l_jobj_flags) { + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_jobj_decimals = json_object_new_uint64(a_token->header_native_update.decimals); + if (!l_jobj_decimals) { + json_object_put(l_jobj_flags); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + l_tsd_total_size = a_token->header_native_update.tsd_total_size; + } + json_object_object_add(l_jobj_header, "flags", l_jobj_flags); + json_object_object_add(l_jobj_header, "decimals", l_jobj_decimals); + l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE"); + } break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC: { + json_object *l_jobj_flags = json_object_new_string(s_flag_str_from_code(a_token->header_public.flags)); + if (!l_jobj_flags){ + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + char *l_premine_supply_str = dap_chain_balance_print(a_token->header_public.premine_supply); + if (!l_premine_supply_str) { + json_object_put(l_jobj_flags); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_premine_supply = json_object_new_string(l_premine_supply_str); + DAP_DELETE(l_premine_supply_str); + if (!l_jobj_premine_supply) { + json_object_put(l_jobj_flags); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_jobj_premine_address = dap_chain_addr_to_json(&a_token->header_public.premine_address); + if (!l_jobj_premine_address) { + json_object_put(l_jobj_flags); + json_object_put(l_jobj_premine_supply); + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_ADDR_TO_JSON, + "Failed to convert address to JSON."); + return NULL; + } + json_object_object_add(l_jobj_header, "flags", l_jobj_flags); + json_object_object_add(l_jobj_header, "premine_supply", l_jobj_premine_supply); + json_object_object_add(l_jobj_header, "premine_address", l_jobj_premine_address); + l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC"); + } break; + default: { + l_jobj_subtype = json_object_new_string("DAP_CHAIN_DATUM_TOKEN_SUBTYPE_UNKNOWN"); + } break; + } + if (!l_jobj_subtype) { + json_object_put(l_jobj_header); + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_token, "subtype", l_jobj_subtype); + json_object_object_add(l_jobj_token, "header", l_jobj_header); + json_object *l_jobj_ticker = json_object_new_string(a_token->ticker); + if (!l_jobj_ticker) { + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_token, "ticker", l_jobj_ticker); + json_object *l_jobj_signs_valid = json_object_new_uint64(a_token->signs_valid); + if (!l_jobj_signs_valid) { + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_token, "signs_valid", l_jobj_signs_valid); + json_object *l_jobj_signs_total = json_object_new_uint64(a_token->signs_total); + if (!l_jobj_signs_total) { + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_jobj_token, "signs_total", l_jobj_signs_total); + json_object *l_obj_signs = json_object_new_array(); + if (!l_obj_signs) { + json_object_put(l_jobj_token); + dap_json_rpc_allocation_error; + return NULL; + } + size_t l_offset = 0; + size_t l_certs_field_size = a_token_size - sizeof(*a_token); + while (l_offset < l_certs_field_size) { + dap_sign_t *l_sign = (dap_sign_t *) ((byte_t*)a_token->data_n_tsd + l_tsd_total_size + l_offset); + l_offset += dap_sign_get_size(l_sign); + json_object *l_obj_sign = dap_sign_to_json(l_sign); + if (!l_obj_sign) { + json_object_put(l_obj_signs); + json_object_put(l_jobj_token); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, "Failed to convert signature to JSON."); + return NULL; + } + json_object_array_add(l_obj_signs, l_obj_sign); + } + json_object_object_add(l_jobj_token, "signs", l_obj_signs); + return l_jobj_token; +} + + +json_object *dap_chain_datum_emission_to_json(dap_chain_datum_token_emission_t *a_emission, size_t a_emission_size){ + json_object *l_emi_obj = json_object_new_object(); + json_object *l_emi_version = json_object_new_uint64(a_emission->hdr.version); + json_object *l_emi_type = json_object_new_string(c_dap_chain_datum_token_emission_type_str[a_emission->hdr.type]); + json_object *l_emi_address = dap_chain_addr_to_json(&a_emission->hdr.address); + json_object *l_emi_header = json_object_new_object(); + json_object *l_emi_data = json_object_new_object(); + if (!l_emi_obj || !l_emi_version || !l_emi_type || !l_emi_address || !l_emi_header || ! l_emi_data) { + json_object_put(l_emi_obj); + json_object_put(l_emi_version); + json_object_put(l_emi_type); + json_object_put(l_emi_address); + json_object_put(l_emi_header); + json_object_put(l_emi_data); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_emi_header, "version", l_emi_version); + json_object_object_add(l_emi_header, "type", l_emi_type); + json_object_object_add(l_emi_header, "address", l_emi_address); + json_object_object_add(l_emi_obj, "header", l_emi_header); + switch (a_emission->hdr.type){ + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: { + json_object *l_obj_size = json_object_new_uint64(a_emission->data.type_auth.size); + json_object *l_obj_tsd_total_size = json_object_new_uint64(a_emission->data.type_auth.tsd_total_size); + json_object *l_obj_signs_count = json_object_new_uint64(a_emission->data.type_auth.signs_count); + if (!l_obj_size || !l_obj_tsd_total_size || !l_obj_signs_count) { + json_object_put(l_obj_size); + json_object_put(l_obj_tsd_total_size); + json_object_put(l_obj_signs_count); + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_emi_data, "size", l_obj_size); + json_object_object_add(l_emi_data, "tsd_total_size", l_obj_tsd_total_size); + json_object_object_add(l_emi_data, "signs_count", l_obj_signs_count); + if (((void *) a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size) > + ((void *) a_emission + a_emission_size)) { + char *l_err_str = dap_strdup_printf("Malformed DATUM type %d, TSD section is out-of-buffer (%" DAP_UINT64_FORMAT_U " vs %zu)", + a_emission->hdr.type, a_emission->data.type_auth.tsd_total_size, a_emission_size); + if (!l_err_str){ + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_err_tsd = json_object_new_string(l_err_str); + DAP_DELETE(l_err_str); + if (!l_err_tsd) { + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_emi_data, "ERROR", l_err_tsd); + } + json_object *l_obj_signs = json_object_new_array(); + if (!l_obj_signs){ + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + size_t l_offset = a_emission->data.type_auth.tsd_total_size; + for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) { + dap_sign_t *l_sign = (dap_sign_t *) ((byte_t*)a_emission->tsd_n_signs + l_offset); + l_offset += dap_sign_get_size(l_sign); + json_object *l_obj_sign = dap_sign_to_json(l_sign); + if (!l_obj_sign) { + json_object_put(l_obj_signs); + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_error_add(3, "Failed to serialize signature to JSON object."); + return NULL; + } + json_object_array_add(l_obj_signs, l_obj_sign); + } + json_object_object_add(l_emi_data, "signs", l_obj_signs); + + } break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: { + json_object *l_code_name = json_object_new_string(a_emission->data.type_algo.codename); + if (!l_code_name) { + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_emi_data, "codename", l_code_name); + } break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: { + json_object *l_value_start = json_object_new_uint64(a_emission->data.type_atom_owner.value_start); + json_object *l_value_change_algo_codename = json_object_new_string( + a_emission->data.type_atom_owner.value_change_algo_codename); + if (!l_value_start || !l_value_change_algo_codename) { + json_object_put(l_value_start); + json_object_put(l_value_change_algo_codename); + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_emi_data, "value_start", l_value_start); + json_object_object_add(l_emi_data, "value_change_algo_codename", l_value_change_algo_codename); + } break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: + { + json_object *l_obj_addr = dap_chain_addr_to_json(&a_emission->data.type_presale.addr); + json_object *l_obj_flags = json_object_new_int64(a_emission->data.type_presale.flags); + json_object *l_obj_lock_time = json_object_new_uint64(a_emission->data.type_presale.lock_time); + if (!l_obj_addr || !l_obj_flags || !l_obj_lock_time) { + json_object_put(l_obj_addr); + json_object_put(l_obj_flags); + json_object_put(l_obj_lock_time); + json_object_put(l_emi_data); + json_object_put(l_emi_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_emi_data, "addr", l_obj_addr); + json_object_object_add(l_emi_data, "flags", l_obj_flags); + json_object_object_add(l_emi_data, "lock_time", l_obj_lock_time); + }break; + } + json_object_object_add(l_emi_obj, "data", l_emi_data); + return l_emi_obj; +} + diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c new file mode 100644 index 0000000000000000000000000000000000000000..0e9ae8475e5bd601bc767d4cf22fcaf721020814 --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c @@ -0,0 +1,134 @@ +#include <memory.h> +#include <assert.h> +#include "dap_common.h" +#include "dap_sign.h" +#include "dap_chain_datum_tx.h" +#include "dap_chain_datum_tx_items.h" + +#include "dap_json_rpc_chain_datum_tx.h" +#include "dap_json_rpc_chain_datum_tx_items.h" +#include "dap_json_rpc_chain_datum_tx_receipt.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_datum_tx" + + + +json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){ + json_object *l_obj_items = json_object_new_array(); + if (!l_obj_items) { + dap_json_rpc_allocation_error; + return NULL; + } + uint32_t l_tx_items_count = 0; + uint32_t l_tx_items_size = a_tx->header.tx_items_size; + while(l_tx_items_count < l_tx_items_size) { + uint8_t *item = a_tx->tx_items + l_tx_items_count; + size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item); + if (l_tx_item_size == 0) { + json_object_put(l_obj_items); + l_obj_items = json_object_new_null(); + break; + } + dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(item); + json_object *l_obj_item_type = NULL, *l_obj_item_data = NULL; + switch (l_item_type) { + case TX_ITEM_TYPE_IN: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN"); + l_obj_item_data = dap_chain_datum_tx_item_in_to_json((dap_chain_tx_in_t*)item); + break; + case TX_ITEM_TYPE_OUT: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT"); + l_obj_item_data = dap_chain_datum_tx_item_out_to_json((dap_chain_tx_out_t*)item); + break; + case TX_ITEM_TYPE_IN_EMS: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_EMS"); + l_obj_item_data = dap_chain_datum_tx_item_in_ems_to_json((dap_chain_tx_in_ems_t*)item); + break; + case TX_ITEM_TYPE_SIG: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_SIG"); + l_obj_item_data = dap_chain_datum_tx_item_sig_to_json((dap_chain_tx_sig_t*)item); + break; + case TX_ITEM_TYPE_RECEIPT: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_RECEIPT"); + l_obj_item_data = dap_chain_datum_tx_receipt_to_json((dap_chain_datum_tx_receipt_t*)item); + break; + case TX_ITEM_TYPE_IN_COND: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN_COND"); + l_obj_item_data = dap_chain_datum_tx_item_in_cond_to_json((dap_chain_tx_in_cond_t*)item); + break; + case TX_ITEM_TYPE_OUT_COND: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_COND"); + + + switch (((dap_chain_tx_out_cond_t*)item)->header.subtype) { + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: + l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_pay_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: + l_obj_item_data = dap_chain_net_srv_stake_lock_cond_out_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: + l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_stake_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: + l_obj_item_data = dap_chain_datum_tx_item_out_cond_srv_xchange_to_json((dap_chain_tx_out_cond_t*)item); + break; + case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: + l_obj_item_data = json_object_new_object(); + break; + default:break; + } + // add time + dap_time_t l_ts_exp = ((dap_chain_tx_out_cond_t*)item)->header.ts_expires; + char l_time_str[32] = "never"; + if (l_ts_exp) { + dap_ctime_r(&l_ts_exp, l_time_str); /* Convert ts to "Sat May 17 01:17:08 2014\n" */ + l_time_str[strlen(l_time_str)-1] = '\0'; /* Remove "\n"*/ + } + json_object_object_add(l_obj_item_data, "ts_expires", json_object_new_string(l_time_str)); + json_object_object_add(l_obj_item_data, "subtype", json_object_new_string(dap_chain_tx_out_cond_subtype_to_str(((dap_chain_tx_out_cond_t*)item)->header.subtype))); + json_object_object_add(l_obj_item_data, "value", json_object_new_string(dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->header.value))); + json_object_object_add(l_obj_item_data, "value_datoshi", json_object_new_string(dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->header.value))); + char * uid_str = DAP_NEW_SIZE(char, 32); + sprintf(uid_str, "0x%016"DAP_UINT64_FORMAT_x"", ((dap_chain_tx_out_cond_t*)item)->header.srv_uid.uint64); + json_object_object_add(l_obj_item_data, "uid", json_object_new_string(uid_str)); + DAP_DEL_Z(uid_str); + break; + case TX_ITEM_TYPE_OUT_EXT: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_OUT_EXT"); + l_obj_item_data = dap_chain_datum_tx_item_out_ext_to_json((dap_chain_tx_out_ext_t*)item); + break; + case TX_ITEM_TYPE_TSD: + l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_TSD"); + l_obj_item_data = dap_chain_datum_tx_item_tsd_to_json((dap_chain_tx_tsd_t*)item); + break; + default: { + char *l_hash_str; + dap_get_data_hash_str_static(a_tx, dap_chain_datum_tx_get_size(a_tx), l_hash_str); + log_it(L_NOTICE, "Transaction %s has an item whose type cannot be handled by the dap_chain_datum_tx_to_json function.", l_hash_str); + break; + } + } + if (!l_obj_item_type){ + json_object_array_add(l_obj_items, json_object_new_null()); + } else { + if (!l_obj_item_data) + l_obj_item_data = json_object_new_null(); + json_object *l_obj_item = json_object_new_object(); + if (!l_obj_item) { + json_object_put(l_obj_item_type); + json_object_put(l_obj_item_data); + json_object_put(l_obj_items); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj_item, "type", l_obj_item_type); + json_object_object_add(l_obj_item, "data", l_obj_item_data); + json_object_array_add(l_obj_items, l_obj_item); + } + + l_tx_items_count += l_tx_item_size; + } + return l_obj_items; +} diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_items.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_items.c new file mode 100644 index 0000000000000000000000000000000000000000..7688d3cee037f16c2ea4ed1d55f3e43437bf1cee --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_items.c @@ -0,0 +1,476 @@ +#include <stdint.h> +#include <string.h> + +#include "dap_common.h" +#include "dap_enc_key.h" +#include "dap_chain_common.h" +#include "dap_sign.h" +#include "dap_hash.h" +#include "dap_chain_datum_tx.h" +#include "dap_chain_datum_tx_in.h" +#include "dap_chain_datum_tx_out.h" +#include "dap_chain_datum_tx_in_cond.h" +#include "dap_chain_datum_tx_out_cond.h" +#include "dap_chain_datum_tx_items.h" +#include "dap_enc_base58.h" + +#include "dap_json_rpc_chain_datum_tx_items.h" +#include "dap_json_rpc_chain_common.h" +#include "dap_json_rpc_sign.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_datum_tx_items" + +json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *item) { + char * l_value_str = dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); + char * l_coins_str = dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); + dap_hash_fast_t * l_hash_tmp = &((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash; + char * l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + json_object *l_obj = json_object_new_object(); + json_object *l_obj_value_str = json_object_new_string(l_value_str); + json_object *l_obj_coins_str = json_object_new_string(l_coins_str); + json_object * l_obj_hash_str = json_object_new_string(l_hash_str); + char * unit_str = DAP_NEW_SIZE(char, 32); + snprintf(unit_str, 32, "0x%08x", ((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit.uint32); + if (!l_obj || !l_obj_coins_str || !l_obj_value_str || !unit_str) { + json_object_put(l_obj); + json_object_put(l_obj_coins_str); + json_object_put(l_obj_value_str); + DAP_DELETE(unit_str); + dap_json_rpc_allocation_error; + return NULL; + } + json_object * l_obj_unit_str = json_object_new_string(unit_str); + json_object_object_add(l_obj, "unit", l_obj_unit_str); + json_object_object_add(l_obj, "pkey", l_obj_hash_str); + json_object_object_add(l_obj, "max_price", l_obj_coins_str); + json_object_object_add(l_obj, "max_price_datoshi", l_obj_value_str); + DAP_DELETE(unit_str); + return l_obj; +} + +json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange) { + if (a_srv_xchange->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE){ + json_object *l_object = json_object_new_object(); + char *l_value = dap_chain_balance_print(a_srv_xchange->header.value); + if (!l_value || !l_object) { + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_value = json_object_new_string(l_value); + if (!l_obj_value) { + json_object_put(l_object); + DAP_DEL_Z(l_value); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DELETE(l_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_xchange->header.srv_uid.uint64); + json_object *l_obj_buy_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.buy_net_id); + json_object *l_obj_sell_net_id = dap_chain_net_id_to_json(a_srv_xchange->subtype.srv_xchange.sell_net_id); + json_object *l_obj_buy_token = json_object_new_string(a_srv_xchange->subtype.srv_xchange.buy_token); + char *l_rate = dap_chain_balance_to_coins(a_srv_xchange->subtype.srv_xchange.rate); + if (!l_rate || !l_obj_srv_uid || !l_obj_buy_net_id || !l_obj_sell_net_id || !l_obj_buy_token) { + json_object_put(l_object); + json_object_put(l_obj_value); + json_object_put(l_obj_srv_uid); + json_object_put(l_obj_buy_net_id); + json_object_put(l_obj_sell_net_id); + json_object_put(l_obj_buy_token); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_rate = json_object_new_string(l_rate); + DAP_DELETE(l_rate); + json_object *l_obj_seller_addr = dap_chain_addr_to_json(&a_srv_xchange->subtype.srv_xchange.seller_addr); + if (!l_obj_seller_addr || !l_obj_rate) { + json_object_put(l_object); + json_object_put(l_obj_value); + json_object_put(l_obj_srv_uid); + json_object_put(l_obj_buy_net_id); + json_object_put(l_obj_sell_net_id); + json_object_put(l_obj_buy_token); + json_object_put(l_obj_rate); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_object, "value", l_obj_value); + json_object_object_add(l_object, "rate", l_obj_rate); + json_object_object_add(l_object, "srv_uid", l_obj_srv_uid); + json_object_object_add(l_object, "buy_net_id", l_obj_buy_net_id); + json_object_object_add(l_object, "sell_net_id", l_obj_sell_net_id); + json_object_object_add(l_object, "buy_token", l_obj_buy_token); + json_object_object_add(l_object, "seller_addr", l_obj_seller_addr); + //TODO: Parse TSD + return l_object; + } + return NULL; +} + +json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake) { + if (a_srv_stake->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE) { + json_object *l_object = json_object_new_object(); + char *l_value = dap_chain_balance_print(a_srv_stake->header.value); + if (!l_value || !l_object) { + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_value = json_object_new_string(l_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_srv_stake->header.srv_uid.uint64); + json_object *l_obj_signing_addr = dap_chain_addr_to_json(&a_srv_stake->subtype.srv_stake_pos_delegate.signing_addr); + char *l_signer_node_addr = dap_strdup_printf( + NODE_ADDR_FP_STR, + NODE_ADDR_FP_ARGS_S(a_srv_stake->subtype.srv_stake_pos_delegate.signer_node_addr)); + if (!l_signer_node_addr || !l_obj_signing_addr || !l_obj_srv_uid || !l_obj_value) { + json_object_put(l_obj_srv_uid); + json_object_put(l_obj_value); + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_signer_node_addr = json_object_new_string(l_signer_node_addr); + if (!l_obj_signer_node_addr) { + DAP_DELETE(l_signer_node_addr); + json_object_put(l_obj_srv_uid); + json_object_put(l_obj_value); + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DELETE(l_value); + DAP_DELETE(l_signer_node_addr); + json_object_object_add(l_object, "value", l_obj_value); + json_object_object_add(l_object, "srv_uid", l_obj_srv_uid); + json_object_object_add(l_object, "signind_addr", l_obj_signing_addr); + json_object_object_add(l_object, "signer_node_addr", l_obj_signer_node_addr); + return l_object; + } + return NULL; +} + + +json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock) +{ + if (a_stake_lock->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK) { + json_object *l_object = json_object_new_object(); + if (!l_object) { + dap_json_rpc_allocation_error; + return NULL; + } + char *l_value = dap_chain_balance_print(a_stake_lock->header.value); + if (!l_value) { + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_value = json_object_new_string(l_value); + if (!l_obj_value) { + DAP_DELETE(l_value); + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DELETE(l_value); + json_object *l_obj_srv_uid = json_object_new_uint64(a_stake_lock->header.srv_uid.uint64); + if (!l_obj_srv_uid) { + json_object_put(l_object); + json_object_put(l_obj_value); + dap_json_rpc_allocation_error; + return NULL; + } + char *l_reinvest_precent = dap_chain_balance_print(a_stake_lock->subtype.srv_stake_lock.reinvest_percent); + if (!l_reinvest_precent) { + json_object_put(l_object); + json_object_put(l_obj_value); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_reinvest_percent = json_object_new_string(l_reinvest_precent); + if (!l_obj_reinvest_percent) { + DAP_DELETE(l_reinvest_precent); + json_object_put(l_object); + json_object_put(l_obj_value); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DELETE(l_reinvest_precent); + json_object *l_obj_time_unlock = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.time_unlock); + if (!l_obj_time_unlock) { + json_object_put(l_obj_reinvest_percent); + json_object_put(l_object); + json_object_put(l_obj_value); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_flags = json_object_new_uint64(a_stake_lock->subtype.srv_stake_lock.flags); + if (!l_obj_flags) { + json_object_put(l_obj_time_unlock); + json_object_put(l_obj_reinvest_percent); + json_object_put(l_object); + json_object_put(l_obj_value); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_object, "value", l_obj_value); + json_object_object_add(l_object, "srv_uid", l_obj_srv_uid); + json_object_object_add(l_object, "reinvest_percent", l_obj_reinvest_percent); + json_object_object_add(l_object, "time_unlock", l_obj_time_unlock); + json_object_object_add(l_object, "flags", l_obj_flags); + return l_object; + } + return NULL; +} + + +json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out) { + json_object *l_object = json_object_new_object(); + json_object *l_value_datoshi = json_object_new_string(dap_chain_balance_print(a_out->header.value)); + json_object *l_value = json_object_new_string(dap_chain_balance_to_coins(a_out->header.value)); + json_object *l_addr = dap_chain_addr_to_json(&a_out->addr); + if (!l_addr || !l_object || !l_addr) { + json_object_put(l_object); + json_object_put(l_value); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_object, "value", l_value); + json_object_object_add(l_object, "value_datoshi", l_value_datoshi); + json_object_object_add(l_object, "address", l_addr); + return l_object; +} + + +json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext) { + json_object *l_obj = json_object_new_object(); + if (!l_obj) { + dap_json_rpc_allocation_error; + return NULL; + } + char *l_value = dap_chain_balance_print(a_out_ext->header.value); + if (!l_value) { + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_value = json_object_new_string(l_value); + DAP_DELETE(l_value); + if (!l_obj_value) { + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_addr = dap_chain_addr_to_json(&a_out_ext->addr); + if (!l_obj_addr) { + json_object_put(l_obj); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_ADDR_TO_JSON, + "Can't get from addr JSON"); + return NULL; + } + json_object *l_obj_token = json_object_new_string(a_out_ext->token); + if (!l_obj_token) { + json_object_put(l_obj_addr); + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj, "value", l_obj_value); + json_object_object_add(l_obj, "addr", l_obj_addr); + json_object_object_add(l_obj, "token", l_obj_token); + return l_obj; +} + +json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond){ + json_object *l_obj = json_object_new_object(); + if (!l_obj) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_receipt_idx = json_object_new_uint64(a_in_cond->header.receipt_idx); + if (!l_obj_receipt_idx) { + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_out_prev_idx = json_object_new_uint64(a_in_cond->header.tx_out_prev_idx); + if (!l_obj_out_prev_idx) { + json_object_put(l_obj_receipt_idx); + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_prev_hash = NULL; + if (dap_hash_fast_is_blank(&a_in_cond->header.tx_prev_hash)){ + l_obj_prev_hash = json_object_new_null(); + } else { + char *l_prev_hash = dap_hash_fast_to_str_new(&a_in_cond->header.tx_prev_hash); + if(!l_prev_hash) { + json_object_put(l_obj_out_prev_idx); + json_object_put(l_obj_receipt_idx); + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + l_obj_prev_hash = json_object_new_string(dap_strdup(l_prev_hash)); + if (!l_obj_prev_hash) { + json_object_put(l_obj_out_prev_idx); + json_object_put(l_obj_receipt_idx); + json_object_put(l_obj); + DAP_DELETE(l_prev_hash); + dap_json_rpc_allocation_error; + return NULL; + } + DAP_DELETE(l_prev_hash); + } + json_object_object_add(l_obj, "receipt_idx", l_obj_receipt_idx); + json_object_object_add(l_obj, "out_prev_idx", l_obj_out_prev_idx); + json_object_object_add(l_obj, "tx_prev_hash", l_obj_prev_hash); + return l_obj; +} + +json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){ + json_object *l_obj_in = json_object_new_object(); + if (!l_obj_in) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_prev_idx = json_object_new_uint64(a_in->header.tx_out_prev_idx); + if (!l_obj_prev_idx) { + json_object_put(l_obj_in); + dap_json_rpc_allocation_error; + return NULL; + } + char l_hash[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_in->header.tx_prev_hash, l_hash, sizeof(l_hash)); + json_object *l_obj_hash = json_object_new_string(l_hash); + if (!l_obj_hash) { + json_object_put(l_obj_in); + json_object_put(l_obj_prev_idx); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj_in, "prev_idx", l_obj_prev_idx); + json_object_object_add(l_obj_in, "prev_hash", l_obj_hash); + return l_obj_in; +} + +json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd){ + json_object *l_object = json_object_new_object(); + if (!l_object) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_tsd_type = json_object_new_int(a_tsd->header.type); + if(!l_obj_tsd_type) { + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_tsd_size = json_object_new_uint64(a_tsd->header.size); + if (!l_obj_tsd_size) { + json_object_put(l_obj_tsd_type); + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_data = json_object_new_string_len((char *)a_tsd->tsd, a_tsd->header.size); + if (!l_obj_data) { + json_object_put(l_obj_tsd_size); + json_object_put(l_obj_tsd_type); + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_object, "type", l_obj_tsd_type); + json_object_object_add(l_object, "size", l_obj_tsd_size); + json_object_object_add(l_object, "data", l_obj_data); + return l_object; +} + +json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems) +{ + json_object *l_object = json_object_new_object(); + if (!l_object) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_ticker = json_object_new_string(a_in_ems->header.ticker); + if (!l_obj_ticker){ + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_chain_id = json_object_new_uint64(a_in_ems->header.token_emission_chain_id.uint64); + if (!l_obj_chain_id) { + json_object_put(l_object); + json_object_put(l_obj_ticker); + dap_json_rpc_allocation_error; + return NULL; + } + char l_ehf[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_in_ems->header.token_emission_hash, l_ehf, sizeof(l_ehf)); + json_object *l_obj_ehf = json_object_new_string(l_ehf); + if (!l_obj_ehf) { + json_object_put(l_object); + json_object_put(l_obj_chain_id); + json_object_put(l_obj_ticker); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_object, "ticker", l_obj_ticker); + json_object_object_add(l_object, "chain_id", l_obj_chain_id); + json_object_object_add(l_object, "emission_hash", l_obj_ehf); + return l_object; +} + +json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee){ + if (a_fee->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { + json_object *l_obj = json_object_new_object(); + if (!l_obj) { + dap_json_rpc_allocation_error; + return NULL; + } + char *l_balance = dap_chain_balance_print(a_fee->header.value); + if (!l_balance) { + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_balance = json_object_new_string(l_balance); + DAP_DELETE(l_balance); + if (!l_obj_balance) { + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj, "balance", l_obj_balance); + return l_obj; + } + return NULL; +} + +json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig){ + json_object *l_object = json_object_new_object(); + if (!l_object) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_sign_size = json_object_new_uint64(a_sig->header.sig_size); + if (!l_sign_size) { + json_object_put(l_object); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_sign = dap_sign_to_json((dap_sign_t*)a_sig->sig); + if (!l_sign) { + json_object_put(l_object); + json_object_put(l_sign_size); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_SIGN_TO_JSON, + "Error serializing signature to JSON."); + return NULL; + } + json_object_object_add(l_object, "sign_size", l_sign_size); + json_object_object_add(l_object, "sign", l_sign); + return l_object; +} diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_receipt.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_receipt.c new file mode 100644 index 0000000000000000000000000000000000000000..a86b12ac71d51d6293938deb0659bec973cc07cf --- /dev/null +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx_receipt.c @@ -0,0 +1,117 @@ +#include "dap_common.h" +#include "dap_enc_key.h" +#include "dap_sign.h" +#include "dap_chain_datum_tx_receipt.h" + +#include "dap_json_rpc_sign.h" +#include "dap_json_rpc_chain_datum_tx_receipt.h" +#include "json.h" + +#define LOG_TAG "dap_json_rpc_chain_datum_tx_receipt" + + +json_object* dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info){ + json_object *l_obj = json_object_new_object(); + if (!l_obj) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_srv_uid = json_object_new_uint64(a_info->srv_uid.uint64); + if (!l_obj_srv_uid) { + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj, "uid", l_obj_srv_uid); + +#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 + json_object *l_obj_addition = json_object_new_uint64(a_info->addition); + if (!l_obj_addition){ + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj, "ext_size", l_obj_addition); +#endif + + json_object * l_obj_units = json_object_new_uint64(a_info->units); + json_object *l_obj_units_type = json_object_new_string(dap_chain_srv_unit_enum_to_str(a_info->units_type.enm)); + if (!l_obj_units_type || !l_obj_units) { + json_object_put(l_obj); + json_object_put(l_obj_units); + json_object_put(l_obj_units_type); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj, "units", l_obj_units); + json_object_object_add(l_obj, "units_type", l_obj_units_type); + + char *l_value = dap_chain_balance_to_coins(a_info->value_datoshi); + char *l_datoshi_value = dap_chain_balance_print(a_info->value_datoshi); + json_object *l_obj_datoshi = json_object_new_string(l_datoshi_value); + json_object *l_obj_value = json_object_new_string(l_value); + if (!l_obj_datoshi || !l_obj_value) { + json_object_put(l_obj_value); + json_object_put(l_obj_datoshi); + DAP_DELETE(l_datoshi_value); + dap_json_rpc_allocation_error; + return NULL; + } + + DAP_DELETE(l_datoshi_value); + DAP_DELETE(l_value); + + json_object_object_add(l_obj, "value", l_obj_value); + json_object_object_add(l_obj, "value_datoshi", l_obj_datoshi); + return l_obj; +} + +json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt) { + json_object *l_obj = json_object_new_object(); + if (!l_obj) { + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_info = dap_chain_receipt_info_to_json(&a_receipt->receipt_info); + if (!l_obj_info) { + json_object_put(l_obj); + return NULL; + } + json_object *l_obj_size = json_object_new_uint64(a_receipt->size); + if (!l_obj_size) { + json_object_put(l_obj); + json_object_put(l_obj_info); + dap_json_rpc_allocation_error; + return NULL; + } + //Provider + dap_sign_t *l_first_sign = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 1); + //Client + dap_sign_t *l_second_sign = dap_chain_datum_tx_receipt_sign_get(a_receipt, a_receipt->size, 2); + json_object *l_obj_signs = json_object_new_object(); + if (!l_obj_signs) { + json_object_put(l_obj_size); + json_object_put(l_obj_info); + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object *l_obj_provider_sign = dap_sign_to_json(l_first_sign); + json_object *l_obj_client_sign = dap_sign_to_json(l_second_sign); + json_object_object_add(l_obj_signs, "provider", l_obj_provider_sign); + json_object_object_add(l_obj_signs, "client", l_obj_client_sign); + json_object *l_exts_data = json_object_new_string_len((char *)a_receipt->exts_n_signs, a_receipt->exts_size); + if (!l_exts_data) { + json_object_put(l_obj_size); + json_object_put(l_obj_info); + json_object_put(l_obj_signs); + json_object_put(l_obj); + dap_json_rpc_allocation_error; + return NULL; + } + json_object_object_add(l_obj, "info", l_obj_info); + json_object_object_add(l_obj, "size", l_obj_size); + json_object_object_add(l_obj, "sings", l_obj_signs); + json_object_object_add(l_obj, "exts_data", l_exts_data); + return l_obj; +} diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_common.h b/modules/json_rpc/common/include/dap_json_rpc_chain_common.h new file mode 100644 index 0000000000000000000000000000000000000000..2e6c4a73168e1443551b3f76658bbd11a15cd354 --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_common.h @@ -0,0 +1,35 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include "dap_chain_common.h" +#include "dap_json_rpc_errors.h" + +json_object *dap_chain_addr_to_json(const dap_chain_addr_t *a_addr); + +DAP_STATIC_INLINE json_object *dap_chain_net_id_to_json(dap_chain_net_id_t a_net_id) { + return json_object_new_uint64(a_net_id.uint64); +} diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum.h new file mode 100644 index 0000000000000000000000000000000000000000..eb42fa19d973e5e419bd151a9044afa5dc769d72 --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum.h @@ -0,0 +1,31 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include "dap_chain_datum.h" +#include "dap_json_rpc_errors.h" + +json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum); +json_object * dap_chain_datum_data_to_json(dap_chain_datum_t *a_datum); \ No newline at end of file diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_anchor.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_anchor.h new file mode 100644 index 0000000000000000000000000000000000000000..96a03be72ea9765bf80d2c0ebdc0d6d88dc4cdfa --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_anchor.h @@ -0,0 +1,33 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + + +#pragma once + +#include "dap_chain_datum_anchor.h" +#include "dap_json_rpc_errors.h" + +json_object *dap_chain_datum_anchor_to_json(dap_chain_datum_anchor_t *a_anchor); + diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_decree.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_decree.h new file mode 100644 index 0000000000000000000000000000000000000000..31342d753823df2342d40807d85d8c5e8150b804 --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_decree.h @@ -0,0 +1,35 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include "dap_chain_datum_decree.h" +#include "dap_json_rpc_errors.h" + +/** + * @brief dap_chain_datum_decree_to_json Convert dap_chain_datum_decree_t tp json_object + * @param a_decree pointer to decree + * @return pointer json_object + */ +json_object *dap_chain_datum_decree_to_json(dap_chain_datum_decree_t *a_decree); diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_token.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_token.h new file mode 100644 index 0000000000000000000000000000000000000000..f9232771ba683add56956657d9d0b8daa5ac434e --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_token.h @@ -0,0 +1,33 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include "dap_chain_datum_token.h" +#include "dap_json_rpc_errors.h" + +json_object *dap_chain_datum_token_to_json(dap_chain_datum_token_t * a_token, size_t a_token_size); +json_object *dap_chain_datum_token_flags_to_json(uint16_t a_flags); +json_object *dap_chain_datum_emission_to_json(dap_chain_datum_token_emission_t *a_emission, size_t a_emission_size); diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx.h new file mode 100644 index 0000000000000000000000000000000000000000..71a89ae9da616614fea742cc774611e9f1ced68c --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx.h @@ -0,0 +1,31 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include "dap_chain_datum_tx.h" +#include "dap_json_rpc_errors.h" + +json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx); diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_items.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_items.h new file mode 100644 index 0000000000000000000000000000000000000000..fdc37b126e9fd65740d18a332b90067bbe4585bb --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_items.h @@ -0,0 +1,42 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include "dap_chain_datum_tx_items.h" +#include "dap_json_rpc_errors.h" + + +json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t *a_in_ems); +json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in); +json_object* dap_chain_datum_tx_item_tsd_to_json(dap_chain_tx_tsd_t *a_tsd); +json_object* dap_chain_datum_tx_item_in_cond_to_json(dap_chain_tx_in_cond_t *a_in_cond); +json_object* dap_chain_datum_tx_item_out_to_json(const dap_chain_tx_out_t *a_out); +json_object* dap_chain_datum_tx_item_out_ext_to_json(const dap_chain_tx_out_ext_t *a_out_ext); +json_object *dap_chain_datum_tx_item_out_cond_fee_to_json(dap_chain_tx_out_cond_t *a_fee); +json_object *dap_chain_datum_tx_item_out_cond_srv_pay_to_json(dap_chain_tx_out_cond_t *item); +json_object* dap_chain_datum_tx_item_out_cond_srv_xchange_to_json(dap_chain_tx_out_cond_t* a_srv_xchange); +json_object *dap_chain_datum_tx_item_out_cond_srv_stake_to_json(dap_chain_tx_out_cond_t* a_srv_stake); +json_object *dap_chain_net_srv_stake_lock_cond_out_to_json(dap_chain_tx_out_cond_t *a_stake_lock); +json_object* dap_chain_datum_tx_item_sig_to_json(const dap_chain_tx_sig_t *a_sig); diff --git a/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_receipt.h b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_receipt.h new file mode 100644 index 0000000000000000000000000000000000000000..a14a231ff23e555066d616e997532bef5b6b8e95 --- /dev/null +++ b/modules/json_rpc/common/include/dap_json_rpc_chain_datum_tx_receipt.h @@ -0,0 +1,31 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ +#pragma once + +#include "dap_chain_datum_tx_receipt.h" +#include "dap_json_rpc_errors.h" + +json_object *dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info); +json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt); \ No newline at end of file diff --git a/modules/json_rpc/mempool/CMakeLists.txt b/modules/json_rpc/mempool/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..86dd39002f2fcdb106097bb8e27b241869f6b3ff --- /dev/null +++ b/modules/json_rpc/mempool/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.10) +project (dap_json_rpc_chain_mempool) + + +file(GLOB DAP_JSON_RPC_CHAIN_MEMPOOL_HEADERS include/*.h) +file(GLOB DAP_JSON_RPC_CHAIN_MEMPOOL_SRCS *.c) + +add_library(${PROJECT_NAME} STATIC ${DAP_JSON_RPC_CHAIN_MEMPOOL_SRCS} ${DAP_JSON_RPC_CHAIN_MEMPOOL_HEADERS}) + +target_link_libraries(dap_json_rpc_chain_mempool dap_http_server dap_client dap_chain_net dap_global_db dap_core dap_chain_cs_blocks dap_chain_mempool dap_json_rpc_core dap_chain_btc_rpc) +target_include_directories(dap_json_rpc_chain_mempool PUBLIC include/ ) diff --git a/modules/mempool/dap_chain_mempool_rpc.c b/modules/json_rpc/mempool/dap_chain_mempool_rpc.c similarity index 71% rename from modules/mempool/dap_chain_mempool_rpc.c rename to modules/json_rpc/mempool/dap_chain_mempool_rpc.c index 5f03b2867e8e7125c144ebfe58988c9299392c59..3f97641be08af203e9d91170c3b8b033416c7795 100644 --- a/modules/mempool/dap_chain_mempool_rpc.c +++ b/modules/json_rpc/mempool/dap_chain_mempool_rpc.c @@ -1,6 +1,53 @@ -#include "dap_chain_mempool_rpc.h" +#include <stddef.h> +#include <stdio.h> +#include <string.h> +#include <stdio.h> +#include <assert.h> +#include <memory.h> + +#ifdef _WIN32 +#include <winsock2.h> +#include <windows.h> +#include <mswsock.h> +#include <ws2tcpip.h> +#include <io.h> +#include <time.h> +#include <pthread.h> +#endif + +#include "dap_common.h" +#include "dap_hash.h" +#include "dap_http_client.h" +#include "dap_http_simple.h" +#include "dap_enc_base58.h" +#include "dap_enc_http.h" +#include "http_status_code.h" +#include "dap_chain_common.h" +#include "dap_chain_node.h" +#include "dap_global_db.h" +#include "dap_enc.h" +#include <dap_enc_http.h> +#include <dap_enc_key.h> +#include <dap_enc_ks.h> #include "dap_chain_mempool.h" +#include "dap_common.h" +#include "dap_list.h" +#include "dap_chain.h" +#include "dap_chain_net.h" +#include "dap_chain_net_tx.h" +#include "dap_sign.h" +#include "dap_chain_datum_tx.h" +#include "dap_chain_datum_tx_items.h" +#include "dap_chain_net_srv.h" +#include "dap_chain_cs_blocks.h" + +#include "dap_chain_mempool_rpc.h" +#include "dap_json_rpc_chain_datum.h" +#include "dap_json_rpc_request_handler.h" +#include "dap_json_rpc_response_handler.h" +#include "json.h" + #define LOG_TAG "dap_chain_mempool_rpc" int dap_chain_mempool_rpc_init(void) { @@ -14,27 +61,27 @@ void dap_chain_mempool_rpc_handler_test(dap_json_rpc_params_t *a_params, UNUSED(a_method); char *l_tn = NULL; // char *l_chain_str = NULL; - for (uint32_t i = 0; i < a_params->lenght; i++) { + for (uint32_t i = 0; i < a_params->length; i++) { dap_json_rpc_param_t *l_prm = a_params->params[i]; if (i == 0) l_tn = l_prm->value_param; } if (dap_strcmp(l_tn, "NULL") == 0) { - a_response->type_result = TYPE_RESPONSE_NULL; + a_response->type = TYPE_RESPONSE_NULL; } else if (dap_strcmp(l_tn, "STRING") == 0) { - a_response->type_result = TYPE_RESPONSE_STRING; + a_response->type = TYPE_RESPONSE_STRING; a_response->result_string = dap_strdup("This test string"); } else if (dap_strcmp(l_tn, "INTEGER") == 0) { - a_response->type_result = TYPE_RESPONSE_INTEGER; + a_response->type = TYPE_RESPONSE_INTEGER; a_response->result_int = 4555745; } else if (dap_strcmp(l_tn, "BOOLEAN") == 0) { - a_response->type_result = TYPE_RESPONSE_BOOLEAN; + a_response->type = TYPE_RESPONSE_BOOLEAN; a_response->result_boolean = true; } else if (dap_strcmp(l_tn, "DOUBLE") == 0) { - a_response->type_result = TYPE_RESPONSE_DOUBLE; + a_response->type = TYPE_RESPONSE_DOUBLE; a_response->result_double = 75.545; } else if (dap_strcmp(l_tn, "JSON") == 0) { - a_response->type_result = TYPE_RESPONSE_JSON; + a_response->type = TYPE_RESPONSE_JSON; json_object *l_obj = json_object_new_object(); json_object *l_int = json_object_new_uint64(45577445); json_object *l_boolean = json_object_new_boolean((json_bool)1); @@ -59,7 +106,7 @@ void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method) { char *l_net_str = NULL; char *l_chain_str = NULL; - for (uint32_t i = 0; i < a_params->lenght; i++) { + for (uint32_t i = 0; i < a_params->length; i++) { dap_json_rpc_param_t *l_prm = a_params->params[i]; if (i == 0) l_net_str = l_prm->value_param; @@ -68,7 +115,7 @@ void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params, } dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str); - a_response->type_result = TYPE_RESPONSE_STRING; + a_response->type = TYPE_RESPONSE_STRING; char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); if(!l_gdb_group_mempool){ a_response->result_string = "{\"datums\":[]}"; @@ -93,7 +140,7 @@ void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params, json_object_array_add(l_object_array, l_obj_datum); } json_object_object_add(l_object, "datums", l_object_array); - a_response->type_result = TYPE_RESPONSE_JSON; + a_response->type = TYPE_RESPONSE_JSON; a_response->result_json_object = l_object; DAP_DELETE(l_gdb_group_mempool); diff --git a/modules/json_rpc/mempool/include/dap_chain_mempool_rpc.h b/modules/json_rpc/mempool/include/dap_chain_mempool_rpc.h new file mode 100644 index 0000000000000000000000000000000000000000..f09bdc17afd4acc8722769a09d425e85bc3c456b --- /dev/null +++ b/modules/json_rpc/mempool/include/dap_chain_mempool_rpc.h @@ -0,0 +1,37 @@ +/* + * Authors: + * Alexey V. Stratulat <alexey.stratulat@demlabs.net> + * Olzhas Zharasbaev <oljas.jarasbaev@demlabs.net> + * DeM Labs Inc. https://demlabs.net + * DeM Labs Open source community https://gitlab.demlabs.net/cellframe/cellframe-sdk + * Copyright (c) 2017-2023 + * All rights reserved. + + This file is part of DAP (Deus Applications Prototypes) the open source project + + DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DAP is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include "dap_json_rpc_errors.h" +#include "dap_json_rpc_response.h" +#include "dap_json_rpc_params.h" + + +int dap_chain_mempool_rpc_init(void); +void dap_chain_mempool_rpc_handler_list(dap_json_rpc_params_t *a_params, + dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_mempool_rpc_handler_test(dap_json_rpc_params_t *a_params, + dap_json_rpc_response_t *a_response, const char *a_method); diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 13478d400a4970f8defae20f429eb17bc9d3e605..d9e41a58b645cea085257ade296d03fb159e50e3 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -78,7 +78,6 @@ static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_db int dap_datum_mempool_init(void) { - dap_chain_mempool_rpc_init(); return 0; } diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt index 97eceff79888dfdf561a62700236e0d2a1f95b76..6fca1d33d2056731e63a2ece9cc51ae9c02e6383 100644 --- a/modules/net/CMakeLists.txt +++ b/modules/net/CMakeLists.txt @@ -30,7 +30,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_client dap_io dap_notify_srv dap_cli_server dap_chain dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_net_srv_xchange dap_chain_cs_none - dap_stream_ch_chain_net dap_stream_ch_chain_voting dap_chain_cs_esbocs) + dap_stream_ch_chain_net dap_stream_ch_chain_voting dap_chain_cs_esbocs dap_json_rpc dap_json_rpc_chain_common) if(LINUX) target_link_libraries(${PROJECT_NAME} resolv) endif() diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 0804aeae13f477f382c851e58ab16e11323965f8..d839e10623d706334c1ec40b53439faacc2f2f28 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -112,9 +112,14 @@ #include "dap_chain_node_net_ban_list.h" #include "dap_chain_net_node_list.h" +#include "dap_json_rpc_errors.h" +#include "dap_json_rpc_chain_datum.h" + + #define LOG_TAG "chain_node_cli_cmd" static void s_dap_chain_net_purge(dap_chain_net_t *a_net); +int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void ** reply); /** * @brief dap_list_t* get_aliases_by_name Get the aliases by name object @@ -597,8 +602,9 @@ void s_dap_chain_net_purge(dap_chain_net_t * a_net) * @return int * return 0 OK, -1 Err */ -int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) +int com_global_db(int a_argc, char ** a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_NAME_CELL, CMD_ADD, CMD_FLUSH, CMD_RECORD, CMD_WRITE, CMD_READ, CMD_DELETE, CMD_DROP, CMD_GET_KEYS }; @@ -1022,8 +1028,9 @@ static dap_tsd_t* s_chain_node_cli_com_node_create_tsd_addr(char **a_argv, int a /** * Node command */ -int com_node(int a_argc, char ** a_argv, char **a_str_reply) +int com_node(int a_argc, char ** a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_ADD, CMD_DEL, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER, CMD_BAN, CMD_UNBAN, CMD_BANLIST @@ -1606,8 +1613,9 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_traceroute(int argc, char** argv, char **a_str_reply) +int com_traceroute(int argc, char** argv, void **reply) { + char ** a_str_reply = (char **) reply; #ifdef DAP_OS_LINUX const char *addr = NULL; int hops = 0, time_usec = 0; @@ -1696,8 +1704,9 @@ int com_traceroute(int argc, char** argv, char **a_str_reply) * @return int * return 0 OK, -1 Err */ -int com_tracepath(int argc, char** argv, char **a_str_reply) +int com_tracepath(int argc, char** argv, void **reply) { + char ** a_str_reply = (char **) reply; #ifdef DAP_OS_LINUX const char *addr = NULL; int hops = 0, time_usec = 0; @@ -1779,8 +1788,9 @@ int com_tracepath(int argc, char** argv, char **a_str_reply) * @param str_reply * @return int */ -int com_ping(int a_argc, char**a_argv, char **a_str_reply) +int com_ping(int a_argc, char**a_argv, void **reply) { + char ** a_str_reply = (char **) reply; #ifdef DAP_OS_LINUX int n = 4,w = 0; @@ -1861,8 +1871,9 @@ int com_ping(int a_argc, char**a_argv, char **a_str_reply) * @param str_reply * @return */ -int com_version(int argc, char ** argv, char **a_str_reply) +int com_version(int argc, char ** argv, void **reply) { + char ** a_str_reply = (char **) reply; (void) argc; (void) argv; #ifndef DAP_VERSION @@ -1884,8 +1895,9 @@ int com_version(int argc, char ** argv, char **a_str_reply) * @param str_reply * @return int */ -int com_help(int a_argc, char **a_argv, char **a_str_reply) +int com_help(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; if (a_argc > 1) { log_it(L_DEBUG, "Help for command %s", a_argv[1]); dap_cli_cmd_t *l_cmd = dap_cli_server_cmd_find(a_argv[1]); @@ -1924,8 +1936,9 @@ int com_help(int a_argc, char **a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_tx_wallet(int a_argc, char **a_argv, char **a_str_reply) +int com_tx_wallet(int a_argc, char **a_argv, void **reply) { +char ** a_str_reply = (char **) reply; const char *c_wallets_path = dap_chain_wallet_get_path(g_config); enum { CMD_NONE, CMD_WALLET_NEW, CMD_WALLET_LIST, CMD_WALLET_INFO, CMD_WALLET_ACTIVATE, CMD_WALLET_DEACTIVATE, CMD_WALLET_CONVERT }; int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; @@ -2289,7 +2302,82 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } +typedef enum dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json { + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING = 101, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL = 102, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND = 103, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND = 104, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_STR_IS_NULL = 105, + DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM = 106, + DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET = 107 +} dap_chain_node_cli_cmd_values_parse_net_chain_err_to_json; +int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int a_argc, + char **a_argv, + dap_chain_t **a_chain, dap_chain_net_t **a_net) { + const char * l_chain_str = NULL; + const char * l_net_str = NULL; + + // Net name + if(a_net) + dap_cli_server_cmd_find_option_val(a_argv, *a_arg_index, a_argc, "-net", &l_net_str); + else { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING, + "Error in internal command processing."); + return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_INTERNAL_COMMAND_PROCESSING; + } + + // Select network + if(!l_net_str) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL, "%s requires parameter '-net'", a_argv[0]); + return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_STR_IS_NUL; + } + if((*a_net = dap_chain_net_by_name(l_net_str)) == NULL) { // Can't find such network + char l_str_to_reply_chain[500] = {0}; + char *l_str_to_reply = NULL; + sprintf(l_str_to_reply_chain, "%s can't find network \"%s\"\n", a_argv[0], l_net_str); + l_str_to_reply = dap_strcat2(l_str_to_reply,l_str_to_reply_chain); + dap_string_t* l_net_str = dap_cli_list_net(); + l_str_to_reply = dap_strcat2(l_str_to_reply,l_net_str->str); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND, "%s can't find network \"%s\"\n%s", a_argv[0], l_net_str, l_str_to_reply); + return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_NET_NOT_FOUND; + } + + // Chain name + if(a_chain) { + dap_cli_server_cmd_find_option_val(a_argv, *a_arg_index, a_argc, "-chain", &l_chain_str); + + // Select chain + if(l_chain_str) { + if ((*a_chain = dap_chain_net_get_chain_by_name(*a_net, l_chain_str)) == NULL) { // Can't find such chain + char l_str_to_reply_chain[500] = {0}; + char *l_str_to_reply = NULL; + sprintf(l_str_to_reply_chain, "%s requires parameter '-chain' to be valid chain name in chain net %s. Current chain %s is not valid\n", + a_argv[0], l_net_str, l_chain_str); + l_str_to_reply = dap_strcat2(l_str_to_reply,l_str_to_reply_chain); + dap_chain_t * l_chain; + dap_chain_net_t * l_chain_net = *a_net; + l_str_to_reply = dap_strcat2(l_str_to_reply,"\nAvailable chains:\n"); + DL_FOREACH(l_chain_net->pub.chains, l_chain) { + l_str_to_reply = dap_strcat2(l_str_to_reply,"\t"); + l_str_to_reply = dap_strcat2(l_str_to_reply,l_chain->name); + l_str_to_reply = dap_strcat2(l_str_to_reply,"\n"); + } + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND, l_str_to_reply); + return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND; + } + } + else if (!strcmp(a_argv[0], "token_decl") || !strcmp(a_argv[0], "token_decl_sign")) { + if ( (*a_chain = dap_chain_net_get_default_chain_by_chain_type(*a_net, CHAIN_TYPE_TOKEN)) == NULL ) + { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM, "%s requires parameter '-chain' or set default datum " + "type in chain configuration file"); + return DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CONFIG_DEFAULT_DATUM; + } + } + } + return 0; +} /** @@ -2431,8 +2519,9 @@ static dap_chain_datum_token_t * s_sign_cert_in_cycle(dap_cert_t ** l_certs, dap * @param str_reply * @return */ -int com_token_decl_sign(int a_argc, char **a_argv, char ** a_str_reply) +int com_token_decl_sign(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; const char * l_hash_out_type = NULL; @@ -2737,184 +2826,425 @@ const char* s_tx_get_main_ticker(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_ * @param a_str_tmp * @param a_hash_out_type */ -void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, dap_string_t * a_str_tmp, const char *a_hash_out_type, bool a_fast){ - int l_removed = 0; +void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, json_object *a_json_obj, const char *a_hash_out_type) { dap_chain_addr_t *l_wallet_addr = dap_chain_addr_from_str(a_add); if (a_add && !l_wallet_addr) { - dap_string_append_printf(a_str_tmp, "Cannot convert string '%s' to binary address.\n", a_add); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_CMD_VALUE_PARSE_CONVERT_BASE58_TO_ADDR_WALLET, "Cannot convert " + "string '%s' to binary address.\n", a_add); + return; + } + char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + if(!l_gdb_group_mempool){ + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_GET_MEMPOOL_GROUP, + "%s.%s: chain not found\n", a_net->pub.name, a_chain->name); return; } - if (l_wallet_addr && a_fast) { - dap_string_append_printf(a_str_tmp, "In fast mode, it is impossible to count the number of " - "transactions and emissions for a specific address. The -fast and -addr " - "options are mutually exclusive.\n"); - DAP_DELETE(l_wallet_addr); + int l_removed = 0; + json_object *l_obj_chain = json_object_new_object(); + json_object *l_obj_chain_name = json_object_new_string(a_chain->name); + if (!l_obj_chain_name || !l_obj_chain) { + json_object_put(l_obj_chain); + dap_json_rpc_allocation_error; return; } + json_object_object_add(l_obj_chain, "name", l_obj_chain_name); dap_chain_mempool_filter(a_chain, &l_removed); - dap_string_append_printf(a_str_tmp, "Removed %i records from the %s chain mempool in %s network. \n\n", - l_removed, a_chain->name, a_net->pub.name); - char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); - if (!l_gdb_group_mempool){ - dap_string_append_printf(a_str_tmp, "%s.%s: chain not found\n", a_net->pub.name, a_chain->name); + json_object *l_jobj_removed = json_object_new_int(l_removed); + if (!l_jobj_removed) { + json_object_put(l_obj_chain); + dap_json_rpc_allocation_error; + return; + } + json_object_object_add(l_obj_chain, "removed", l_jobj_removed); + size_t l_objs_count = 0; + size_t l_objs_addr = 0; + dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_count); + json_object *l_jobj_datums; + if (l_objs_count == 0) { + l_jobj_datums = json_object_new_null(); } else { - size_t l_objs_count = 0; - size_t l_objs_addr = 0; - dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_count); - for(size_t i = 0; i < l_objs_count; i++) { - dap_chain_datum_t *l_datum = (dap_chain_datum_t *) l_objs[i].value; - if (!l_datum->header.data_size || (l_datum->header.data_size > l_objs[i].value_len)) { - log_it(L_ERROR, "Trash datum in GDB %s.%s, key: %s data_size:%u, value_len:%zu", - a_net->pub.name, a_chain->name, l_objs[i].key, l_datum->header.data_size, l_objs[i].value_len); - dap_global_db_del_sync(l_gdb_group_mempool, l_objs[i].key); - continue; + l_jobj_datums = json_object_new_array(); + if (!l_jobj_datums) { + json_object_put(l_obj_chain); + dap_json_rpc_allocation_error; + return; + } + } + for(size_t i = 0; i < l_objs_count; i++) { + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; + if (!l_datum->header.data_size || (l_datum->header.data_size > l_objs[i].value_len)) { + log_it(L_ERROR, "Trash datum in GDB %s.%s, key: %s data_size:%u, value_len:%zu", + a_net->pub.name, a_chain->name, l_objs[i].key, l_datum->header.data_size, l_objs[i].value_len); + dap_global_db_del_sync(l_gdb_group_mempool, l_objs[i].key); + continue; + } + dap_time_t l_ts_create = (dap_time_t) l_datum->header.ts_create; + const char *l_datum_type = dap_chain_datum_type_id_to_str(l_datum->header.type_id); + dap_hash_fast_t l_datum_real_hash = {0}; + dap_hash_fast_t l_datum_hash_from_key = {0}; + dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_datum_real_hash); + dap_chain_hash_fast_from_str(l_objs[i].key, &l_datum_hash_from_key); + char buff_time[50]; + dap_time_to_str_rfc822(buff_time, 50, l_datum->header.ts_create); + json_object *l_jobj_type = json_object_new_string(l_datum_type); + json_object *l_jobj_hash = json_object_new_string(l_objs[i].key); + json_object *l_jobj_ts_created = json_object_new_object(); + json_object *l_jobj_ts_created_time_stamp = json_object_new_uint64(l_ts_create); + json_object *l_jobj_ts_created_str = json_object_new_string(buff_time); + if (!l_jobj_type || !l_jobj_hash || !l_jobj_ts_created || !l_jobj_ts_created_str || !l_jobj_ts_created_time_stamp) { + json_object_put(l_jobj_type); + json_object_put(l_jobj_hash); + json_object_put(l_jobj_ts_created); + json_object_put(l_jobj_ts_created_time_stamp); + json_object_put(l_jobj_ts_created_str); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return; + } + json_object_object_add(l_jobj_ts_created, "time_stamp", l_jobj_ts_created_time_stamp); + json_object_object_add(l_jobj_ts_created, "str", l_jobj_ts_created_str); + json_object *l_jobj_datum = json_object_new_object(); + if (!l_jobj_datum) { + json_object_put(l_jobj_type); + json_object_put(l_jobj_hash); + json_object_put(l_jobj_ts_created); + json_object_put(l_jobj_ts_created_time_stamp); + json_object_put(l_jobj_ts_created_str); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return; + } + if (!dap_hash_fast_compare(&l_datum_real_hash, &l_datum_hash_from_key)){ + char *l_drh_str = dap_hash_fast_to_str_new(&l_datum_real_hash); + char *l_wgn = dap_strdup_printf("Key field in DB %s does not match datum's hash %s\n", + l_objs[i].key, l_drh_str); + DAP_DELETE(l_drh_str); + if (!l_wgn) { + dap_global_db_objs_delete(l_objs, l_objs_count); + json_object_put(l_jobj_datum); + json_object_put(l_obj_chain); + json_object_put(l_jobj_type); + json_object_put(l_jobj_hash); + json_object_put(l_jobj_ts_created); + json_object_put(l_jobj_datums); + dap_json_rpc_allocation_error; + return; + } + json_object *l_jobj_warning = json_object_new_string(l_wgn); + DAP_DELETE(l_wgn); + if (!l_jobj_warning) { + dap_global_db_objs_delete(l_objs, l_objs_count); + json_object_put(l_jobj_datum); + json_object_put(l_obj_chain); + json_object_put(l_jobj_type); + json_object_put(l_jobj_hash); + json_object_put(l_jobj_ts_created); + json_object_put(l_jobj_datums); + dap_json_rpc_allocation_error; + return; } - dap_time_t l_ts_create = (dap_time_t) l_datum->header.ts_create; - const char *l_datum_type = dap_chain_datum_type_id_to_str(l_datum->header.type_id); - char buff_time[50]; - dap_time_to_str_rfc822(buff_time, 50, l_datum->header.ts_create); - dap_string_append_printf(a_str_tmp, "%s hash %s %s\n", l_datum_type, l_objs[i].key, buff_time); - if (!a_fast) { - bool datum_is_accepted_addr = false; - switch (l_datum->header.type_id) { - case DAP_CHAIN_DATUM_TX: { - dap_chain_addr_t l_addr_from; - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *) l_datum->data; - const char *l_main_token = s_tx_get_main_ticker(l_tx, a_net, NULL); - dap_list_t *l_list_sig_item = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_SIG, NULL); - if (!l_list_sig_item) { - dap_string_append_printf(a_str_tmp, - "\tAn item with a type TX_ITEM_TYPE_SIG for the transaction " - "was not found, the transaction may be corrupted.\n"); - break; + json_object_object_add(l_jobj_datum, "warning", l_jobj_warning); + json_object_array_add(l_jobj_datums, l_jobj_datum); + continue; + } + json_object_object_add(l_jobj_datum, "hash", l_jobj_hash); + json_object_object_add(l_jobj_datum, "type", l_jobj_type); + json_object_object_add(l_jobj_datum, "created", l_jobj_ts_created); + bool datum_is_accepted_addr = false; + switch (l_datum->header.type_id) { + case DAP_CHAIN_DATUM_TX: { + dap_chain_addr_t l_addr_from; + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; + const char *l_main_token = s_tx_get_main_ticker(l_tx, a_net, NULL); + dap_list_t *l_list_sig_item = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_SIG, NULL); + if (!l_list_sig_item) { + json_object *l_jobj_wgn = json_object_new_string("An item with a type TX_ITEM_TYPE_SIG for the " + "transaction was not found, the transaction may " + "be corrupted."); + json_object_object_add(l_jobj_datum, "warning", l_jobj_wgn); + break; + } + dap_chain_tx_sig_t *l_sig = l_list_sig_item->data; + dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig(l_sig); + dap_chain_addr_fill_from_sign(&l_addr_from, l_sign, a_net->pub.id); + if (l_wallet_addr && dap_chain_addr_compare(l_wallet_addr, &l_addr_from)) { + datum_is_accepted_addr = true; + } + dap_list_free(l_list_sig_item); + char *l_addr_from_str = dap_chain_addr_to_str(&l_addr_from); + if (!l_addr_from_str) { + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return; + } + json_object *l_jobj_addr_from = json_object_new_string(l_addr_from_str); + DAP_DELETE(l_addr_from_str); + if (!l_jobj_addr_from) { + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return; + } + json_object_object_add(l_jobj_datum, "from", l_jobj_addr_from); + dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL); + json_object *l_jobj_to_list = json_object_new_array(); + json_object *l_jobj_change_list = json_object_new_array(); + json_object *l_jobj_fee_list = json_object_new_array(); + if (!l_jobj_to_list || !l_jobj_change_list || !l_jobj_fee_list) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return; + } + for (dap_list_t *it = l_list_out_items; it; it = it->next) { + dap_chain_addr_t *l_dist_addr = NULL; + uint256_t l_value = uint256_0; + const char *l_dist_token = NULL; + uint8_t l_type = *(uint8_t*)it->data; + switch (l_type) { + case TX_ITEM_TYPE_OUT: { + l_value = ((dap_chain_tx_out_t*)it->data)->header.value; + l_dist_token = l_main_token; + l_dist_addr = &((dap_chain_tx_out_t*)it->data)->addr; + } break; + case TX_ITEM_TYPE_OUT_EXT: { + l_value = ((dap_chain_tx_out_ext_t*)it->data)->header.value; + l_dist_token = ((dap_chain_tx_out_ext_t*)it->data)->token; + l_dist_addr = &((dap_chain_tx_out_ext_t*)it->data)->addr; + } break; + case TX_ITEM_TYPE_OUT_COND: { + l_value = ((dap_chain_tx_out_cond_t*)it->data)->header.value; + if (((dap_chain_tx_out_cond_t*)it->data)->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { + l_dist_token = a_net->pub.native_ticker; + } + } break; + default: break; + } + json_object *l_jobj_money = json_object_new_object(); + if (!l_jobj_money){ + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; + } + char *l_value_str = dap_chain_balance_print(l_value); + if (!l_value_str) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; + } + char *l_value_coins_str = dap_chain_balance_to_coins(l_value); + if (!l_value_coins_str) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + DAP_DELETE(l_value_str); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; + } + json_object *l_jobj_value = json_object_new_string(l_value_str); + if (!l_jobj_value) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + DAP_DELETE(l_value_str); + DAP_DELETE(l_value_coins_str); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; + } + json_object_object_add(l_jobj_money, "value", l_jobj_value); + json_object *l_jobj_value_coins = json_object_new_string(l_value_coins_str); + if (!l_jobj_value_coins){ + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + DAP_DELETE(l_value_str); + DAP_DELETE(l_value_coins_str); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; + } + json_object_object_add(l_jobj_money, "coins", l_jobj_value_coins); + if (l_dist_token) { + json_object *l_jobj_token = json_object_new_string(l_dist_token); + if (!l_jobj_token) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + DAP_DELETE(l_value_str); + DAP_DELETE(l_value_coins_str); + dap_global_db_objs_delete(l_objs, l_objs_count); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return; } - dap_chain_tx_sig_t *l_sig = l_list_sig_item->data; - dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig(l_sig); - dap_chain_addr_fill_from_sign(&l_addr_from, l_sign, a_net->pub.id); - if (l_wallet_addr && dap_chain_addr_compare(l_wallet_addr, &l_addr_from)) { - datum_is_accepted_addr = true; + json_object_object_add(l_jobj_money, "token", l_jobj_token); + } + + if (l_dist_addr) { + char *l_addr_str = dap_chain_addr_to_str(l_dist_addr); + if (!l_addr_str) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + DAP_DELETE(l_value_str); + DAP_DELETE(l_value_coins_str); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; + } + json_object *l_jobj_addr = json_object_new_string(l_addr_str); + if (!l_jobj_addr) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); + DAP_DELETE(l_value_str); + DAP_DELETE(l_value_coins_str); + DAP_DELETE(l_addr_str); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; } - dap_list_free(l_list_sig_item); - char *l_addr_from_str = dap_chain_addr_to_str(&l_addr_from); - dap_list_t *l_list_in_reward = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_REWARD, NULL); - if (l_list_in_reward) { - dap_chain_tx_in_reward_t *l_in_reward = (dap_chain_tx_in_reward_t*)l_list_in_reward->data; - char *l_block_hash = dap_chain_hash_fast_to_str_new(&l_in_reward->block_hash); - dap_string_append_printf(a_str_tmp, "\tForm block reward: %s\n", l_block_hash); - DAP_DELETE(l_block_hash); - } else { - dap_string_append_printf(a_str_tmp, "\tFrom: %s\n", l_addr_from_str); + if (!datum_is_accepted_addr && l_wallet_addr) { + datum_is_accepted_addr = dap_chain_addr_compare(l_wallet_addr, l_dist_addr); } - dap_list_free(l_list_in_reward); - DAP_DELETE(l_addr_from_str); - dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL); - for (dap_list_t *it = l_list_out_items; it; it = it->next) { - dap_chain_addr_t *l_dist_addr = NULL; - uint256_t l_value = uint256_0; - const char *l_dist_token = NULL; - uint8_t l_type = *(uint8_t *) it->data; - const char *l_type_out_str = "To"; - switch (l_type) { - case TX_ITEM_TYPE_OUT: { - l_value = ((dap_chain_tx_out_t *) it->data)->header.value; - l_dist_token = l_main_token; - l_dist_addr = &((dap_chain_tx_out_t *) it->data)->addr; - } - break; - case TX_ITEM_TYPE_OUT_EXT: { - l_value = ((dap_chain_tx_out_ext_t *) it->data)->header.value; - l_dist_token = ((dap_chain_tx_out_ext_t *) it->data)->token; - l_dist_addr = &((dap_chain_tx_out_ext_t *) it->data)->addr; - } - break; - case TX_ITEM_TYPE_OUT_COND: { - dap_chain_tx_out_cond_t *l_out_cond = (dap_chain_tx_out_cond_t*)it->data; - l_value = ((dap_chain_tx_out_cond_t *) it->data)->header.value; - switch (l_out_cond->header.subtype) { - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE: { - l_dist_token = a_net->pub.native_ticker; - l_type_out_str = "Fee"; - } break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: { - l_dist_token = l_main_token; - l_dist_addr = NULL; - l_type_out_str = "Stake lock"; - } break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: { - l_dist_token = l_main_token; - l_type_out_str = "xchange"; - } break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: { - l_dist_token = l_main_token; - l_type_out_str = "Stake pos delegate"; - } break; - case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: { - l_dist_token = l_main_token; - l_type_out_str = "Pay"; - } break; - default: - break; - } - } - break; - default: - break; - } - char *l_value_str = dap_chain_balance_print(l_value); - char *l_value_coins_str = dap_chain_balance_to_coins(l_value); - if (!l_dist_addr) { - dap_string_append_printf(a_str_tmp, "\t%s: %s (%s) %s\n", l_type_out_str, - l_value_coins_str, l_value_str, l_dist_token); - } else { - char *l_addr_str = dap_chain_addr_to_str(l_dist_addr); - if (!datum_is_accepted_addr && l_wallet_addr) { - datum_is_accepted_addr = dap_chain_addr_compare(l_wallet_addr, l_dist_addr); - } - dap_chain_addr_compare(&l_addr_from, l_dist_addr) ? - dap_string_append_printf(a_str_tmp, "\tСhange: %s (%s) %s\n", - l_value_coins_str, l_value_str, l_dist_token) : - dap_string_append_printf(a_str_tmp, "\tTo: %s (%s) %s %s\n", - l_value_coins_str, l_value_str, l_dist_token, l_addr_str); - DAP_DELETE(l_addr_str); - } + json_object *l_jobj_f = json_object_new_object(); + if (!l_jobj_f) { + json_object_put(l_jobj_to_list); + json_object_put(l_jobj_change_list); + json_object_put(l_jobj_fee_list); DAP_DELETE(l_value_str); DAP_DELETE(l_value_coins_str); + DAP_DELETE(l_addr_str); + json_object_put(l_jobj_addr); + json_object_put(l_jobj_money); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_datums); + json_object_put(l_obj_chain); + dap_global_db_objs_delete(l_objs, l_objs_count); + return; } - dap_list_free(l_list_out_items); - } - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - size_t l_emi_size = 0; - dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_read(l_datum->data, - &l_emi_size); - if (l_wallet_addr && l_emi && dap_chain_addr_compare(l_wallet_addr, &l_emi->hdr.address)) - datum_is_accepted_addr = true; - DAP_DELETE(l_emi); - dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type, a_net->pub.id); + json_object_object_add(l_jobj_f, "money", l_jobj_money); + if (dap_chain_addr_compare(&l_addr_from, l_dist_addr)) { + json_object_array_add(l_jobj_change_list, l_jobj_f); + } else { + json_object_object_add(l_jobj_f, "addr", l_jobj_addr); + json_object_array_add(l_jobj_to_list, l_jobj_f); + } + + DAP_DELETE(l_value_str); + DAP_DELETE(l_value_coins_str); + DAP_DELETE(l_addr_str); + } else { + json_object_array_add(l_jobj_fee_list, l_jobj_money); } - break; - default: - dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type, a_net->pub.id); - } - if (datum_is_accepted_addr) { - l_objs_addr++; } - } + json_object_object_add(l_jobj_datum, "to", l_jobj_to_list); + json_object_object_add(l_jobj_datum, "change", l_jobj_change_list); + json_object_object_add(l_jobj_datum, "fee", l_jobj_fee_list); + dap_list_free(l_list_out_items); + } break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION: { + size_t l_emi_size = 0; + dap_chain_datum_token_emission_t *l_emi = dap_chain_datum_emission_read(l_datum->data, &l_emi_size); + if (l_wallet_addr && l_emi && dap_chain_addr_compare(l_wallet_addr, &l_emi->hdr.address)) + datum_is_accepted_addr = true; + DAP_DELETE(l_emi); + json_object_object_add(l_jobj_datum, "data", dap_chain_datum_data_to_json(l_datum)); + } break; + default: + json_object_object_add(l_jobj_datum, "data", dap_chain_datum_data_to_json(l_datum)); } - if (l_wallet_addr) { - dap_string_append_printf(a_str_tmp, l_objs_addr ? "%s.%s: Total %zu records\n" - : "%s.%s: No records\n", a_net->pub.name, a_chain->name, - l_objs_addr); - } else { - dap_string_append_printf(a_str_tmp, l_objs_count ? "%s.%s: Total %zu records\n" - : "%s.%s: No records\n", a_net->pub.name, a_chain->name, - l_objs_count); + json_object_array_add(l_jobj_datums, l_jobj_datum); + } + dap_global_db_objs_delete(l_objs, l_objs_count); + json_object_object_add(l_obj_chain, "datums", l_jobj_datums); + if (a_add) { + json_object *l_ev_addr = json_object_new_int64(l_objs_count); + if (!l_ev_addr) { + json_object_put(l_obj_chain); + dap_json_rpc_allocation_error; + return; } - dap_global_db_objs_delete(l_objs, l_objs_count); - DAP_DELETE(l_gdb_group_mempool); + json_object_object_add(l_obj_chain, "number_elements_per_address", l_ev_addr); } + json_object_array_add(a_json_obj, l_obj_chain); + DAP_DELETE(l_gdb_group_mempool); +} + +static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_hash_str, json_object **a_json_reply) { + char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + uint8_t *l_data_tmp = dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash_str, + NULL, NULL, NULL); + if(l_data_tmp && dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash_str) == 0) { + char *l_msg_str = dap_strdup_printf("Datum %s deleted", a_datum_hash_str); + json_object *l_msg = json_object_new_string(l_msg_str); + DAP_DELETE(l_msg_str); + if (!l_msg) { + dap_json_rpc_allocation_error; + DAP_DELETE(l_gdb_group_mempool); + DAP_DELETE(l_data_tmp); + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_array_add(*a_json_reply, l_msg); + DAP_DELETE(l_gdb_group_mempool); + DAP_DELETE(l_data_tmp); + return 0; + } else { + DAP_DELETE(l_gdb_group_mempool); + DAP_DELETE(l_data_tmp); + return 1; + } } +typedef enum cmd_mempool_delete_err_list{ + COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, + COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND +}cmd_mempool_delete_err_list_t; /** * @brief _cmd_mempool_delete * @param argc @@ -2923,27 +3253,44 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a * @param a_str_reply * @return */ -int _cmd_mempool_delete(dap_chain_t *a_chain, const char *a_datum_hash, char **a_str_reply) +int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, void **reply) { - if (!a_chain || !a_datum_hash) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Chain or datum hash not specified"); - return -1; + json_object ** a_json_reply = (json_object **) reply; + if (!a_net || !a_datum_hash) { + dap_json_rpc_error_add(COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT, "Net or datum hash not specified"); + return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT; } - char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); - uint8_t *l_data_tmp = dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash, - NULL, NULL, NULL); - if(l_data_tmp && dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash) == 0) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s deleted", a_datum_hash); - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_data_tmp); - return 0; + int res = 0; + if (!a_chain) { + dap_chain_t * l_chain; + DL_FOREACH(a_net->pub.chains, l_chain){ + res = mempool_delete_for_chain(l_chain, a_datum_hash, a_json_reply); + if (res == 0) { + break; + } + } } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Can't find datum %s", a_datum_hash); - DAP_DELETE(l_gdb_group_mempool); - return -4; + res = mempool_delete_for_chain(a_chain, a_datum_hash, a_json_reply); } + if (res) { + char *l_msg_str = dap_strdup_printf("Error! Can't find datum %s", a_datum_hash); + if (!l_msg_str) { + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_msg = json_object_new_string(l_msg_str); + DAP_DELETE(l_msg_str); + if (!l_msg) { + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_array_add(*a_json_reply, l_msg); + return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND; + } + return 0; } + /** * @brief s_com_mempool_check_datum_in_chain * @param a_chain @@ -2960,6 +3307,14 @@ dap_chain_datum_t *s_com_mempool_check_datum_in_chain(dap_chain_t *a_chain, cons return (dap_chain_datum_t *)l_data_tmp; } +typedef enum cmd_mempool_check_err_list { + COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_CHAIN = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, + COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET, + COM_MEMPOOL_CHECK_ERR_REQUIRES_DATUM_HASH, + COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR, + COM_MEMPOOL_CHECK_ERR_DATUM_NOT_FIND +}cmd_mempool_check_err_list_t; + /** * @brief _cmd_mempool_check * @param a_net @@ -2969,46 +3324,45 @@ dap_chain_datum_t *s_com_mempool_check_datum_in_chain(dap_chain_t *a_chain, cons * @param a_str_reply * @return int */ -int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, char **a_str_reply) { +int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char **a_hash_out_type, void ** reply) { + json_object ** a_json_reply = (json_object **) reply; + if (!a_net || !a_datum_hash) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The network or datum hash is not defined. It is " - "impossible to determine the presence of this datum in the mempool."); - return -1; + dap_json_rpc_error_add(COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET, "Error! Both -net <network_name> " + "and -datum <data_hash> parameters are required."); + return COM_MEMPOOL_CHECK_ERR_CAN_NOT_FIND_NET; } dap_chain_datum_t *l_datum = NULL; + char *l_chain_name = a_chain ? a_chain->name : NULL; bool l_found_in_chains = false; - /* For search in blockchain */ - const char *l_chain_name = NULL; - int l_ret_code = -1; - char l_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_hash_fast_t l_atom_hash; - /* ------------------------ */ - if (!a_chain) { - dap_chain_t *l_chain = NULL; - DL_FOREACH(a_net->pub.chains, l_chain) { - l_datum = s_com_mempool_check_datum_in_chain(l_chain, a_datum_hash); + int l_ret_code = 0; + dap_hash_fast_t l_atom_hash = {}; + if (a_chain) + l_datum = s_com_mempool_check_datum_in_chain(a_chain, a_datum_hash); + else { + dap_chain_t *it = NULL; + DL_FOREACH(a_net->pub.chains, it) { + l_datum = s_com_mempool_check_datum_in_chain(it, a_datum_hash); if (l_datum) { - l_chain_name = l_chain->name; + l_chain_name = it->name; break; } } - } else { - l_datum = s_com_mempool_check_datum_in_chain(a_chain, a_datum_hash); - l_chain_name = a_chain->name; } if (!l_datum) { l_found_in_chains = true; dap_hash_fast_t l_datum_hash; if (dap_chain_hash_fast_from_hex_str(a_datum_hash, &l_datum_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Incorrect hash string %s", a_datum_hash); - return -4; + dap_json_rpc_error_add(COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR, + "Incorrect hash string %s", a_datum_hash); + return COM_MEMPOOL_CHECK_ERR_INCORRECT_HASH_STR; } if (a_chain) - l_datum = a_chain->callback_datum_find_by_hash ? a_chain->callback_datum_find_by_hash(a_chain, &l_datum_hash, &l_atom_hash, &l_ret_code) : NULL; + l_datum = a_chain->callback_datum_find_by_hash(a_chain, &l_datum_hash, &l_atom_hash, &l_ret_code); else { dap_chain_t *it = NULL; DL_FOREACH(a_net->pub.chains, it) { - l_datum = it->callback_datum_find_by_hash ? it->callback_datum_find_by_hash(it, &l_datum_hash, &l_atom_hash, &l_ret_code) : NULL; + l_datum = it->callback_datum_find_by_hash(it, &l_datum_hash, &l_atom_hash, &l_ret_code); if (l_datum) { l_chain_name = it->name; break; @@ -3016,29 +3370,101 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char } } } + json_object *l_jobj_datum = json_object_new_object(); + json_object *l_datum_hash = json_object_new_string(a_datum_hash); + json_object *l_net_obj = json_object_new_string(a_net->pub.name); + if (!l_jobj_datum || !l_datum_hash || !l_net_obj){ + json_object_put(l_jobj_datum); + json_object_put(l_datum_hash); + json_object_put(l_net_obj); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_chain_obj; + if(l_chain_name) { + l_chain_obj = json_object_new_string(l_chain_name); + if (!l_chain_obj) { + json_object_put(l_jobj_datum); + json_object_put(l_datum_hash); + json_object_put(l_net_obj); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + } else + l_chain_obj = json_object_new_null(); + json_object_object_add(l_jobj_datum, "hash", l_datum_hash); + json_object_object_add(l_jobj_datum, "net", l_net_obj); + json_object_object_add(l_jobj_datum, "chain", l_chain_obj); + json_object *l_find_bool; if (l_datum) { - dap_string_t *l_str_reply = dap_string_new(""); - dap_string_append_printf(l_str_reply, "Datum %s is present in %s.%s\n", a_datum_hash, - l_found_in_chains ? "chains" : "mempool", l_chain_name); + l_find_bool = json_object_new_boolean(TRUE); + json_object *l_find_chain_or_mempool = json_object_new_string(l_found_in_chains ? "chain" : "mempool"); + if (!l_find_chain_or_mempool || !l_find_bool) { + json_object_put(l_find_chain_or_mempool); + json_object_put(l_find_bool); + json_object_put(l_jobj_datum); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_datum, "find", l_find_bool); + json_object_object_add(l_jobj_datum, "source", l_find_chain_or_mempool); if (l_found_in_chains) { + char l_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&l_atom_hash, l_atom_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); - dap_string_append_printf(l_str_reply, "Atom hash is %s return code is %d (%s)\n", - l_atom_hash_str, l_ret_code, dap_ledger_tx_check_err_str(l_ret_code)); + json_object *l_obj_atom = json_object_new_object(); + json_object *l_jobj_atom_hash = json_object_new_string(l_atom_hash_str); + json_object *l_jobj_atom_err = json_object_new_string(dap_ledger_tx_check_err_str(l_ret_code)); + if (!l_obj_atom || !l_jobj_atom_hash || !l_jobj_atom_err) { + json_object_put(l_jobj_datum); + json_object_put(l_obj_atom); + json_object_put(l_jobj_atom_hash); + json_object_put(l_jobj_atom_err); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_obj_atom, "hash", l_jobj_atom_hash); + json_object_object_add(l_obj_atom, "err", l_jobj_atom_err); + json_object_object_add(l_jobj_datum, "atom", l_obj_atom); + } + json_object *l_datum_obj_inf = dap_chain_datum_to_json(l_datum); + if (!l_datum_obj_inf) { + if (!l_found_in_chains) + DAP_DELETE(l_datum); + json_object_put(l_jobj_datum); + dap_json_rpc_error_add(DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON, + "Failed to serialize datum to JSON."); + return DAP_JSON_RPC_ERR_CODE_SERIALIZATION_DATUM_TO_JSON; } - dap_chain_datum_dump(l_str_reply, l_datum, a_hash_out_type, a_net->pub.id); if (!l_found_in_chains) DAP_DELETE(l_datum); - *a_str_reply = l_str_reply->str; - dap_string_free(l_str_reply, false); + json_object_array_add(*a_json_reply, l_jobj_datum); return 0; } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find datum %s in %s.%s", - a_datum_hash, a_net->pub.name, a_chain ? a_chain->name : ""); - return -4; + l_find_bool = json_object_new_boolean(TRUE); + if (!l_find_bool) { + json_object_put(l_jobj_datum); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_datum, "find", l_find_bool); + json_object_array_add(*a_json_reply, l_jobj_datum); + return COM_MEMPOOL_CHECK_ERR_DATUM_NOT_FIND; } - return 0; } +typedef enum cmd_mempool_proc_list_error{ + DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_GET_DATUM_HASH_FROM_STR, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_FALSE_VERIFY, + DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL + +}cmd_mempool_proc_list_error_t; + /** * @brief _cmd_mempool_proc * process mempool datum @@ -3048,80 +3474,175 @@ int _cmd_mempool_check(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * @param a_str_reply * @return */ -int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, char **a_str_reply) +int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, void **reply) { + // If full or light it doesnt work if(dap_chain_net_get_role(a_net).enums>= NODE_ROLE_FULL){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "Need master node role or higher for network %s " - "to process this command", a_net->pub.name); - return -1; + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL, + "Need master node role or higher for network %s to process this command", a_net->pub.name); + return DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL; } + int ret = 0; char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); - dap_string_t * l_str_tmp = dap_string_new(NULL); + if (!l_gdb_group_mempool){ + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME, + "Failed to get mempool group name on network %s", a_net->pub.name); + return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME; + } size_t l_datum_size=0; dap_chain_datum_t * l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash, - &l_datum_size, NULL, NULL ); - + &l_datum_size, NULL, NULL ); size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0; if (l_datum_size != l_datum_size2) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes", - a_datum_hash, l_datum_size2, l_datum_size); + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes", + a_datum_hash, l_datum_size2, l_datum_size); DAP_DELETE(l_gdb_group_mempool); - return -8; + return DAP_COM_MEMPOOL_PROC_LIST_ERROR_DATUM_CORRUPT_SIZE_DATUM_NOT_EQUALS_SIZE_RECORD; } if (!l_datum) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Can't find datum %s", a_datum_hash); + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM, + "Error! Can't find datum %s", a_datum_hash); DAP_DELETE(l_gdb_group_mempool); - return -4; + return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_FIND_DATUM; } dap_hash_fast_t l_datum_hash, l_real_hash; - dap_chain_hash_fast_from_str(a_datum_hash, &l_datum_hash); + if (dap_chain_hash_fast_from_hex_str(a_datum_hash, &l_datum_hash)) { + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM, + "Error! Can't convert datum hash string %s to digital form", + a_datum_hash); + DAP_DELETE(l_gdb_group_mempool); + return DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_CONVERT_DATUM_HASH_TO_DIGITAL_FORM; + } dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_real_hash); if (!dap_hash_fast_compare(&l_datum_hash, &l_real_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Datum's real hash doesn't match datum's hash string %s", - a_datum_hash); + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING, + "Error! Datum's real hash doesn't match datum's hash string %s", + a_datum_hash); DAP_DELETE(l_gdb_group_mempool); - return -6; + return DAP_COM_MEMPOOL_PROC_LIST_ERROR_REAL_HASH_DATUM_DOES_NOT_MATCH_HASH_DATA_STRING; } char buf[50]; dap_time_t l_ts_create = (dap_time_t)l_datum->header.ts_create; const char *l_type = NULL; DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_type); - dap_string_append_printf(l_str_tmp, "hash %s: type_id=%s ts_create=%s data_size=%u\n", - a_datum_hash, l_type, - dap_ctime_r(&l_ts_create, buf), l_datum->header.data_size); - int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, l_datum, &l_datum_hash) ; + json_object *l_jobj_res = json_object_new_object(); + json_object *l_jobj_datum = json_object_new_object(); + json_object *l_jobj_hash = json_object_new_string(a_datum_hash); + json_object *l_jobj_type = json_object_new_string(l_type); + json_object *l_jobj_ts_created = json_object_new_object(); + json_object *l_jobj_ts_created_time_stamp = json_object_new_uint64(l_ts_create); + char *l_ts_created_str = dap_ctime_r(&l_ts_create, buf); + if (!l_ts_created_str || !l_jobj_ts_created || !l_jobj_ts_created_time_stamp || !l_jobj_type || + !l_jobj_hash || !l_jobj_datum || !l_jobj_res) { + json_object_put(l_jobj_res); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_hash); + json_object_put(l_jobj_type); + json_object_put(l_jobj_ts_created); + json_object_put(l_jobj_ts_created_time_stamp); + DAP_DEL_Z(l_ts_created_str); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_jobj_ts_created_str = json_object_new_string(l_ts_created_str); + DAP_DEL_Z(l_ts_created_str); + json_object *l_jobj_data_size = json_object_new_uint64(l_datum->header.data_size); + if (!l_jobj_ts_created_str || !l_jobj_data_size) { + json_object_put(l_jobj_res); + json_object_put(l_jobj_datum); + json_object_put(l_jobj_hash); + json_object_put(l_jobj_type); + json_object_put(l_jobj_ts_created); + json_object_put(l_jobj_ts_created_time_stamp); + json_object_put(l_jobj_ts_created_str); + json_object_put(l_jobj_data_size); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_datum, "hash", l_jobj_hash); + json_object_object_add(l_jobj_datum, "type", l_jobj_type); + json_object_object_add(l_jobj_ts_created, "time_stamp", l_jobj_ts_created_time_stamp); + json_object_object_add(l_jobj_ts_created, "str", l_jobj_ts_created_str); + json_object_object_add(l_jobj_datum, "ts_created", l_jobj_ts_created); + json_object_object_add(l_jobj_datum, "data_size", l_jobj_data_size); + json_object_object_add(l_jobj_res, "datum", l_jobj_datum); + json_object *l_jobj_verify = json_object_new_object(); + if (!l_jobj_verify) { + json_object_put(l_jobj_res); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + int l_verify_datum = dap_chain_net_verify_datum_for_add(a_chain, l_datum, &l_datum_hash); if (l_verify_datum){ - dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications (%s) examine node log files", - dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum)); - ret = -9; + json_object *l_jobj_verify_err = json_object_new_string(dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum)); + json_object *l_jobj_verify_status = json_object_new_boolean(FALSE); + if (!l_jobj_verify_status || !l_jobj_verify_err) { + json_object_put(l_jobj_verify_status); + json_object_put(l_jobj_verify_err); + json_object_put(l_jobj_verify); + json_object_put(l_jobj_res); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status); + json_object_object_add(l_jobj_verify, "error", l_jobj_verify_err); + ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_FALSE_VERIFY; } else { if (a_chain->callback_add_datums) { if (a_chain->callback_add_datums(a_chain, &l_datum, 1) == 0) { - dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications, examine node log files"); - ret = -6; + json_object *l_jobj_verify_status = json_object_new_boolean(FALSE); + if (!l_jobj_verify_status) { + json_object_put(l_jobj_verify_status); + json_object_put(l_jobj_verify); + json_object_put(l_jobj_res); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status); + ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_FALSE_VERIFY; } else { - dap_string_append_printf(l_str_tmp, "Datum processed well. "); - char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + json_object *l_jobj_verify_status = json_object_new_boolean(TRUE); + if (!l_jobj_verify_status) { + json_object_put(l_jobj_verify); + json_object_put(l_jobj_res); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_verify, "isProcessed", l_jobj_verify_status); if (dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash)){ - dap_string_append_printf(l_str_tmp, "Warning! Can't delete datum from mempool!"); - } else - dap_string_append_printf(l_str_tmp, "Removed datum from mempool."); - DAP_DELETE(l_gdb_group_mempool); + json_object *l_jobj_wrn_text = json_object_new_string("Can't delete datum from mempool!"); + if (!l_jobj_wrn_text) { + json_object_put(l_jobj_verify); + json_object_put(l_jobj_res); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_verify, "warning", l_jobj_wrn_text); + } else { + json_object *l_jobj_text = json_object_new_string("Removed datum from mempool."); + if (!l_jobj_text) { + json_object_put(l_jobj_verify); + json_object_put(l_jobj_res); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_jobj_verify, "notice", l_jobj_text); + } } } else { - dap_string_append_printf(l_str_tmp, "Error! Can't move to no-concensus chains from mempool"); - ret = -1; + dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL, "Error! Can't move to no-concensus chains from mempool"); + ret = DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_MOVE_TO_NO_CONCENSUS_FROM_MEMPOOL; } } - dap_string_append_printf(l_str_tmp, "\n"); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); DAP_DELETE(l_gdb_group_mempool); + json_object_object_add(l_jobj_res, "verify", l_jobj_verify); + json_object_array_add(*reply, l_jobj_res); return ret; } + /** * @breif _cmd_mempool_proc_all * @param a_net @@ -3129,25 +3650,255 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * * @param a_str_reply * @return */ -int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, char ** a_str_reply) { +int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, void **reply) { + json_object ** a_json_reply = (json_object **) reply; if (!a_net || !a_chain) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The net and chain argument is not set"); - return -1; + dap_json_rpc_error_add(-2, "The net and chain argument is not set"); + return -2; + } + + json_object *l_ret = json_object_new_object(); + if (!l_ret){ + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } if(!dap_chain_net_by_id(a_chain->net_id)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s.%s: chain not found\n", a_net->pub.name, - a_chain->name); + char *l_warn_str = dap_strdup_printf("%s.%s: chain not found\n", a_net->pub.name, + a_chain->name); + if (!l_warn_str) { + json_object_put(l_ret); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_warn_obj = json_object_new_string(l_warn_str); + DAP_DELETE(l_warn_str); + if (!l_warn_obj){ + json_object_put(l_ret); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_ret, "warning", l_warn_obj); } #ifdef DAP_TPS_TEST - dap_ledger_set_tps_start_time(a_net->pub.ledger); + dap_chain_ledger_set_tps_start_time(a_net->pub.ledger); #endif dap_chain_node_mempool_process_all(a_chain, true); - dap_cli_server_cmd_set_reply_text(a_str_reply, "The entire mempool has been processed in %s.%s.", - a_net->pub.name, a_chain->name); + char *l_str_result = dap_strdup_printf("The entire mempool has been processed in %s.%s.", + a_net->pub.name, a_chain->name); + if (!l_str_result) { + json_object_put(l_ret); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_obj_result = json_object_new_string(l_str_result); + DAP_DEL_Z(l_str_result); + if (!l_obj_result) { + json_object_put(l_ret); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_object_add(l_ret, "result", l_obj_result); + json_object_array_add(*a_json_reply, l_obj_result); + return 0; +} + +typedef enum _cmd_mempool_dump_error_list{ + COM_DUMP_ERROR_LIST_CORRUPTED_SIZE = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, + COM_DUMP_ERROR_CAN_NOT_FIND_DATUM, + COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION +}_cmd_mempool_dump_error_list_t; + +int _cmd_mempool_dump_from_group(dap_chain_net_id_t a_net_id, const char *a_group_gdb, const char *a_datum_hash, + const char *a_hash_out_type, json_object **reply) { + size_t l_datum_size = 0; + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(a_group_gdb, a_datum_hash, + &l_datum_size, NULL, NULL ); + size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0; + if (l_datum_size != l_datum_size2) { + dap_json_rpc_error_add(COM_DUMP_ERROR_LIST_CORRUPTED_SIZE, "Error! Corrupted datum %s, size by datum headers " + "is %zd when in mempool is only %zd bytes", + a_datum_hash, l_datum_size2, l_datum_size); + return COM_DUMP_ERROR_LIST_CORRUPTED_SIZE; + } + if (!l_datum) { + char *l_msg_str = dap_strdup_printf("Error! Can't find datum %s in %s", a_datum_hash, a_group_gdb); + if (!l_msg_str) { + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return -1; + } + json_object *l_jobj_message = json_object_new_string(l_msg_str); + return COM_DUMP_ERROR_CAN_NOT_FIND_DATUM; + } + json_object *l_jobj_datum = dap_chain_datum_to_json(l_datum); + json_object_array_add(*reply, l_jobj_datum); return 0; } +int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, json_object **reply) { + if (!a_net || !a_datum_hash || !a_hash_out_type) { + dap_json_rpc_error_add(COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION, "The following arguments are not set: network," + " datum hash, and output hash type. " + "Functions required for operation."); + return COM_DUMP_ERROR_NULL_IS_ARGUMENT_FUNCTION; + } + if (a_chain) { + char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + _cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, reply); + DAP_DELETE(l_group_mempool); + } else { + dap_chain_t *l_chain = NULL; + DL_FOREACH(a_net->pub.chains, l_chain){ + char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, reply)){ + DAP_DELETE(l_group_mempool); + break; + } + DAP_DELETE(l_group_mempool); + } + } + return 0; +} + +int com_mempool(int a_argc, char **a_argv, void **reply){ + int arg_index = 1; + dap_chain_net_t *l_net = NULL; + dap_chain_t *l_chain = NULL; + const char *l_addr_b58 = NULL; + enum _subcmd {SUBCMD_LIST, SUBCMD_PROC, SUBCMD_PROC_ALL, SUBCMD_DELETE, SUBCMD_ADD_CA, SUBCMD_CHECK, SUBCMD_DUMP}; + enum _subcmd l_cmd; + if (a_argv[1]) { + if (!dap_strcmp(a_argv[1], "list")) { + l_cmd = SUBCMD_LIST; + } else if (!dap_strcmp(a_argv[1], "proc")) { + l_cmd = SUBCMD_PROC; + } else if (!dap_strcmp(a_argv[1], "proc_all")) { + l_cmd = SUBCMD_PROC_ALL; + } else if (!dap_strcmp(a_argv[1], "delete")) { + l_cmd = SUBCMD_DELETE; + } else if (!dap_strcmp(a_argv[1], "add_ca")) { + l_cmd = SUBCMD_ADD_CA; + } else if (!dap_strcmp(a_argv[1], "dump")) { + l_cmd = SUBCMD_DUMP; + } else if (!dap_strcmp(a_argv[1], "check")) { + l_cmd = SUBCMD_CHECK; + } else { + char *l_str_err = dap_strdup_printf("Invalid sub command specified. Ыub command %s " + "is not supported.", a_argv[1]); + if (!l_str_err) { + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return -1; + } + json_object *l_jobj_str_err = json_object_new_string(l_str_err); + DAP_DELETE(l_str_err); + if (!l_jobj_str_err) { + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return -1; + } + json_object_array_add(*reply, l_jobj_str_err); + return -2; + } + } + dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, a_argc, a_argv, &l_chain, &l_net); + const char *l_hash_out_type = "hex"; + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); + const char *l_datum_hash_in = NULL; + const char *l_datum_hash = NULL; + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_in); + if (l_datum_hash_in) { + if(dap_strncmp(l_datum_hash_in, "0x", 2) && dap_strncmp(l_datum_hash_in, "0X", 2)) { + l_datum_hash = dap_enc_base58_to_hex_str_from_str(l_datum_hash_in); + } else + l_datum_hash = dap_strdup(l_datum_hash_in); + } + int ret = -100; + switch (l_cmd) { + case SUBCMD_LIST: { + if (!l_net) { + dap_json_rpc_error_add(-5, "The command does not include the net parameter. Please specify the " + "parameter something like this mempool list -net <net_name>"); + return -5; + } + json_object *obj_ret = json_object_new_object(); + json_object *obj_net = json_object_new_string(l_net->pub.name); + if (!obj_ret || !obj_net) { + json_object_put(obj_ret); + json_object_put(obj_net); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return -1; + } + json_object_object_add(obj_ret, "net", obj_net); + const char *l_wallet_addr = NULL; + if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_wallet_addr) && !l_wallet_addr) { + json_object *l_jobj_err = json_object_new_string("Parameter '-addr' require <addr>"); + if (!l_jobj_err) { + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return -1; + } + json_object_array_add(*reply, l_jobj_err); + return -3; + } + json_object *l_jobj_chains = json_object_new_array(); + if (!l_jobj_chains) { + json_object_put(obj_ret); + DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + return -1; + } + if(l_chain) { + s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type); + } else { + DL_FOREACH(l_net->pub.chains, l_chain) { + s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_jobj_chains, l_hash_out_type); + } + } + json_object_object_add(obj_ret, "chains", l_jobj_chains); + json_object_array_add(*reply, obj_ret); + ret = 0; + } break; + case SUBCMD_PROC: { + ret = _cmd_mempool_proc(l_net, l_chain, l_datum_hash, reply); + } break; + case SUBCMD_PROC_ALL: { + ret = _cmd_mempool_proc_all(l_net, l_chain, reply); + } break; + case SUBCMD_DELETE: { + if (!l_chain) { + dap_json_rpc_error_add(-2, "The chain parameter was not specified or was specified incorrectly."); + ret = -2; + } + if (l_datum_hash) { + ret = _cmd_mempool_delete(l_net, l_chain, l_datum_hash, reply); + } else { + dap_json_rpc_error_add(-3, "Error! %s requires -datum <datum hash> option", a_argv[0]); + ret = -3; + } + } break; + case SUBCMD_ADD_CA: { + const char *l_ca_name = NULL; + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name); + if (!l_ca_name) { + dap_json_rpc_error_add(-3, "mempool add_ca requires parameter '-ca_name' to specify the certificate name"); + ret = -3; + } + dap_cert_t *l_cert = dap_cert_find_by_name(l_ca_name); + if (!l_cert) { + dap_json_rpc_error_add(-4, "Cert with name '%s' not found.", l_ca_name); + ret = -4; + } + ret = _cmd_mempool_add_ca(l_net, l_chain, l_cert, reply); + DAP_DELETE(l_cert); + } break; + case SUBCMD_CHECK: { + ret = _cmd_mempool_check(l_net, l_chain, l_datum_hash, l_hash_out_type, reply); + } break; + case SUBCMD_DUMP: { + ret = _cmd_mempool_dump(l_net, l_chain, l_datum_hash, l_hash_out_type, reply); + } break; + } + DAP_DEL_Z(l_datum_hash); + return ret; +} + /** * @brief * @@ -3542,8 +4293,9 @@ static int s_token_decl_check_params(int a_argc, char **a_argv, char **a_str_rep "\t -tx_sender_blocked <value>:\t Blocked tx sender(s)\n" "\n" */ -int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) +int com_token_decl(int a_argc, char ** a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; const char * l_ticker = NULL; uint256_t l_total_supply = {}; // 256 uint16_t l_signs_emission = 0; @@ -3878,8 +4630,9 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) "\t -tx_sender_blocked_remove <value>:\t Remove tx sender(s) from blocked\n" "\n" */ -int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) +int com_token_update(int a_argc, char ** a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; const char * l_ticker = NULL; uint256_t l_total_supply = {}; // 256 uint16_t l_signs_emission = 0; @@ -4044,8 +4797,9 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) * @param str_reply * @return */ -int com_token_emit(int a_argc, char **a_argv, char **a_str_reply) +int com_token_emit(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; const char *str_tmp = NULL; //const char *str_fee = NULL; @@ -4242,8 +4996,9 @@ int com_token_emit(int a_argc, char **a_argv, char **a_str_reply) * @param a_str_reply * @return int */ -int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) +int com_tx_cond_create(int a_argc, char ** a_argv, void **reply) { + char ** a_str_reply = (char **) reply; (void) a_argc; int arg_index = 1; const char *c_wallets_path = dap_chain_wallet_get_path(g_config); @@ -4390,6 +5145,16 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) return -1; } +typedef enum cmd_mempool_add_ca_error_list{ + COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND = DAP_JSON_RPC_ERR_CODE_METHOD_ERR_START, + COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET, + COM_MEMPOOL_ADD_CA_ERROR_REQUIRES_PARAMETER_CA_NAME, + COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_FIND_CERTIFICATE, + COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS, + COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA, + COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, + COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_PLACE_CERTIFICATE +}cmd_mempool_add_ca_error_list_t; /** * @brief _cmd_mempool_add_ca * @details Place public CA into the mempool @@ -4399,286 +5164,112 @@ int com_tx_cond_create(int a_argc, char ** a_argv, char **a_str_reply) * @param a_str_reply * @return */ -int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, char **a_str_reply) +int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void ** reply) { - if (!a_net) - return -1; - else if (a_str_reply && *a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; + json_object ** a_json_reply = (json_object **) reply; + if (!a_net || !a_chain || !a_cert){ + dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND, "The network or certificate attribute was not passed."); + return COM_MEMPOOL_ADD_CA_ERROR_NET_NOT_FOUND; } - dap_chain_t *l_chain = a_chain; - + dap_chain_t *l_chain = NULL; // Chech for chain if was set or not - if (!l_chain){ + if (!a_chain){ // If wasn't set - trying to auto detect l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_CA); if (!l_chain) { // If can't auto detect // clean previous error code - dap_cli_server_cmd_set_reply_text(a_str_reply, - "No chains for CA datum in network \"%s\"", a_net->pub.name ); - return -2; + dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET, + "No chains for CA datum in network \"%s\"", a_net->pub.name); + return COM_MEMPOOL_ADD_CA_ERROR_NO_CAINS_FOR_CA_DATUM_IN_NET; } } - if (!a_cert){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "mempool_add_ca_public requires parameter '-ca_name' to specify the certificate name"); - return -3; - } if(!a_cert->enc_key){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Corrupted certificate \"%s\" without keys certificate", a_cert->name); - return -5; + dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS, + "Corrupted certificate \"%s\" without keys certificate", a_cert->name); + return COM_MEMPOOL_ADD_CA_ERROR_CORRUPTED_CERTIFICATE_WITHOUT_KEYS; } if (a_cert->enc_key->priv_key_data_size || a_cert->enc_key->priv_key_data){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Certificate \"%s\" has private key data. Please export public only key certificate without private keys", a_cert->name); - return -6; + dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA, + "Certificate \"%s\" has private key data. Please export public only key certificate without private keys", a_cert->name); + return COM_MEMPOOL_ADD_CA_ERROR_CERTIFICATE_HAS_PRIVATE_KEY_DATA; } // Serialize certificate into memory uint32_t l_cert_serialized_size = 0; byte_t * l_cert_serialized = dap_cert_mem_save(a_cert, &l_cert_serialized_size); - if (!l_cert_serialized){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't serialize in memory certificate \"%s\"", a_cert->name); - return -7; + if(!l_cert_serialized){ + dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, + "Can't serialize in memory certificate \"%s\"", a_cert->name); + return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE; } // Now all the chechs passed, forming datum for mempool dap_chain_datum_t * l_datum = dap_chain_datum_create( DAP_CHAIN_DATUM_CA, l_cert_serialized , l_cert_serialized_size); - DAP_DELETE(l_cert_serialized); + DAP_DELETE( l_cert_serialized); if(!l_datum){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't produce datum from certificate \"%s\"", a_cert->name); - return -7; + dap_json_rpc_error_add(COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE, + "Can't produce datum from certificate \"%s\"", a_cert->name); + return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_SERIALIZE; } // Finaly add datum to mempool char *l_hash_str = dap_chain_mempool_datum_add(l_datum, l_chain, "hex"); DAP_DELETE(l_datum); if (l_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Datum %s was successfully placed to mempool", l_hash_str); + char *l_msg = dap_strdup_printf("Datum %s was successfully placed to mempool", l_hash_str); + if (!l_msg) { + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_obj_message = json_object_new_string(l_msg); + DAP_DELETE(l_msg); DAP_DELETE(l_hash_str); + if (!l_obj_message) { + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object_array_add(*a_json_reply, l_obj_message); return 0; } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't place certificate \"%s\" to mempool", a_cert->name); - return -8; - } -} - -/** - * @brief _cmd_mempool_dump_from_group - * @param a_net_id - * @param a_group_gdb - * @param a_datum_hash - * @param a_hash_out_type - * @param a_str_tmp - * @return - */ -int _cmd_mempool_dump_from_group(dap_chain_net_id_t a_net_id, const char *a_group_gdb, const char *a_datum_hash, const char *a_hash_out_type, dap_string_t *a_str_tmp) { - size_t l_datum_size = 0; - dap_chain_datum_t * l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(a_group_gdb, a_datum_hash, - &l_datum_size, NULL, NULL ); - size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0; - if (l_datum_size != l_datum_size2) { - dap_string_append_printf(a_str_tmp,"Error! Corrupted datum %s, size by datum headers " - "is %zd when in mempool is only %zd bytes", - a_datum_hash, l_datum_size2, l_datum_size); - return -101; - } - if (!l_datum) { - dap_string_append_printf(a_str_tmp, "Error! Can't find datum %s in %s", a_datum_hash, a_group_gdb); - return -102; - } - dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type, a_net_id); - return 0; -} - -/** - * @brief _cmd_mempool_dump - * @param a_net - * @param a_chain - * @param a_datum_hash - * @param a_hash_out_type - * @param a_str_ret - * @return - */ -int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char *a_datum_hash, const char *a_hash_out_type, dap_string_t *a_str_ret) { - if (!a_str_ret) - return -1; - if (!a_net || !a_datum_hash || !a_hash_out_type) { - return -2; - } - if (a_chain) { - char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); - _cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_str_ret); - DAP_DELETE(l_group_mempool); - } else { - dap_chain_t *l_chain = NULL; - DL_FOREACH(a_net->pub.chains, l_chain){ - char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); - if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_str_ret)){ - DAP_DELETE(l_group_mempool); - break; - } - DAP_DELETE(l_group_mempool); + char *l_msg = dap_strdup_printf("Can't place certificate \"%s\" to mempool", a_cert->name); + if (!l_msg) { + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; + } + json_object *l_obj_msg = json_object_new_string(l_msg); + DAP_DELETE(l_msg); + if (!l_obj_msg) { + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } + json_object_array_add(*a_json_reply, l_obj_msg); + return COM_MEMPOOL_ADD_CA_ERROR_CAN_NOT_PLACE_CERTIFICATE; } - return 0; } /** - * @brief com_mempool + * @brief com_chain_ca_copy + * @details copy public CA into the mempool * @param a_argc * @param a_argv + * @param a_arg_func * @param a_str_reply * @return */ -int com_mempool(int a_argc, char **a_argv, char **a_str_reply){ - int arg_index = 1; - dap_chain_net_t *l_net = NULL; - dap_chain_t *l_chain = NULL; - const char *l_addr_b58 = NULL; - enum _subcmd {SUBCMD_LIST, SUBCMD_PROC, SUBCMD_PROC_ALL, SUBCMD_DELETE, SUBCMD_ADD_CA, SUBCMD_CHECK, SUBCMD_DUMP, SUBCMD_COUNT}; - enum _subcmd l_cmd = 0; - if (a_argv[1]) { - char *lts = a_argv[1]; - if (!dap_strcmp(lts, "list")) { - l_cmd = SUBCMD_LIST; - } else if (!dap_strcmp(lts, "proc")) { - l_cmd = SUBCMD_PROC; - } else if (!dap_strcmp(lts, "proc_all")) { - l_cmd = SUBCMD_PROC_ALL; - } else if (!dap_strcmp(lts, "delete")) { - l_cmd = SUBCMD_DELETE; - } else if (!dap_strcmp(lts, "add_ca")) { - l_cmd = SUBCMD_ADD_CA; - } else if (!dap_strcmp(lts, "dump")) { - l_cmd = SUBCMD_DUMP; - } else if (!dap_strcmp(lts, "check")) { - l_cmd = SUBCMD_CHECK; - } else if (!dap_strcmp(lts, "count")) { - l_cmd = SUBCMD_COUNT; - } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid sub command specified. Ыub command %s " - "is not supported.", lts); - return -1; - } - } - dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net); - if (!l_net) { - return -2; - } - const char *l_hash_out_type = "hex"; - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); - const char *l_datum_hash_in = NULL; - const char *l_datum_hash = NULL; - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_in); - if (l_datum_hash_in) { - if(dap_strncmp(l_datum_hash_in, "0x", 2) && dap_strncmp(l_datum_hash_in, "0X", 2)) { - l_datum_hash = dap_enc_base58_to_hex_str_from_str(l_datum_hash_in); - } else - l_datum_hash = dap_strdup(l_datum_hash_in); - } - int ret = -100; - switch (l_cmd) { - case SUBCMD_LIST: { - const char *l_wallet_addr = NULL; - if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_wallet_addr) && !l_wallet_addr) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Parameter '-addr' require <addr>"); - ret = -1; - break; - } - bool l_fast = (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "-fast") != -1) ? true : false; - dap_string_t * l_str_tmp = dap_string_new(NULL); - if(l_chain) - s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_str_tmp, l_hash_out_type, l_fast); - else - DL_FOREACH(l_net->pub.chains, l_chain) - s_com_mempool_list_print_for_chain(l_net, l_chain, l_wallet_addr, l_str_tmp, l_hash_out_type, l_fast); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); - ret = 0; - } break; - case SUBCMD_PROC: { - ret = _cmd_mempool_proc(l_net, l_chain, l_datum_hash, a_str_reply); - } break; - case SUBCMD_PROC_ALL: { - ret = _cmd_mempool_proc_all(l_net, l_chain, a_str_reply); - } break; - case SUBCMD_DELETE: { - if (!l_chain) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The chain parameter was not specified or " - "was specified incorrectly."); - ret = -2; - } - if (l_datum_hash) { - ret = _cmd_mempool_delete(l_chain, l_datum_hash, a_str_reply); - } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", a_argv[0]); - ret = -3; - } - } break; - case SUBCMD_ADD_CA: { - const char *l_ca_name = NULL; - dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-ca_name", &l_ca_name); - if (!l_ca_name) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "mempool add_ca requires parameter '-ca_name' to specify the certificate name"); - ret = -3; - } - dap_cert_t *l_cert = dap_cert_find_by_name(l_ca_name); - if (!l_cert) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Cert with name '%s' not found.", l_ca_name); - ret = -4; - } - ret = _cmd_mempool_add_ca(l_net, l_chain, l_cert, a_str_reply); - DAP_DELETE(l_cert); - } break; - case SUBCMD_CHECK: { - ret = _cmd_mempool_check(l_net, l_chain, l_datum_hash, l_hash_out_type, a_str_reply); - } break; - case SUBCMD_DUMP: { - dap_string_t *l_str_ret = dap_string_new(NULL); - ret = _cmd_mempool_dump(l_net, l_chain, l_datum_hash, l_hash_out_type, l_str_ret); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret->str); - dap_string_free(l_str_ret, true); - } break; - case SUBCMD_COUNT: { - char *l_mempool_group; - dap_string_t *l_str_ret = dap_string_new(NULL); - if (!l_chain) { - DL_FOREACH(l_net->pub.chains, l_chain) { - l_mempool_group = dap_chain_net_get_gdb_group_mempool_new(l_chain); - size_t l_objs_count = 0; - dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_mempool_group, &l_objs_count); - dap_global_db_objs_delete(l_objs, l_objs_count); - DAP_DELETE(l_mempool_group); - dap_string_append_printf(l_str_ret, "%zu records found in mempool %s.%s\n", l_objs_count, - l_net->pub.name, l_chain->name); - } - } else { - l_mempool_group = dap_chain_net_get_gdb_group_mempool_new(l_chain); - size_t l_objs_count = 0; - dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_mempool_group, &l_objs_count); - dap_global_db_objs_delete(l_objs, l_objs_count); - DAP_DELETE(l_mempool_group); - dap_string_append_printf(l_str_ret, "%zu records found in mempool %s.%s\n", l_objs_count, - l_net->pub.name, l_chain->name); - } - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret->str); - dap_string_free(l_str_ret, true); - } break; - } - DAP_DEL_Z(l_datum_hash); +int com_chain_ca_copy( int a_argc, char ** a_argv, void ** reply) +{ + int l_argc = a_argc + 1; + char **l_argv = DAP_NEW_Z_COUNT(char*, l_argc); + l_argv[0] = "mempool"; + l_argv[1] = "add_ca"; + for (int i = 1; i < a_argc; i++) + l_argv[i + 1] = a_argv[i]; + int ret = com_mempool(l_argc, l_argv, reply); + DAP_DEL_Z(l_argv); return ret; } - /** * @brief com_chain_ca_pub * @details place public CA into the mempool @@ -4688,8 +5279,9 @@ int com_mempool(int a_argc, char **a_argv, char **a_str_reply){ * @param a_str_reply * @return */ -int com_chain_ca_pub( int a_argc, char ** a_argv, char ** a_str_reply) +int com_chain_ca_pub( int a_argc, char ** a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; // Read params const char * l_ca_name = NULL; @@ -4767,6 +5359,7 @@ int com_chain_ca_pub( int a_argc, char ** a_argv, char ** a_str_reply) } } + static const char* s_json_get_text(struct json_object *a_json, const char *a_key) { if(!a_json || !a_key) @@ -4896,8 +5489,9 @@ static dap_pkey_t* s_json_get_pkey(struct json_object *a_json) * @param str_reply * @return int */ -int com_tx_create_json(int a_argc, char ** a_argv, char **a_str_reply) +int com_tx_create_json(int a_argc, char ** a_argv, void ** reply) { + char** a_str_reply = (char **) reply; int l_arg_index = 1; int l_err_code = 0; const char *l_net_name = NULL; // optional parameter @@ -5545,8 +6139,9 @@ int com_tx_create_json(int a_argc, char ** a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_tx_create(int a_argc, char **a_argv, char **a_str_reply) +int com_tx_create(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; // int cmd_num = 1; // const char *value_str = NULL; @@ -5801,8 +6396,9 @@ int com_tx_create(int a_argc, char **a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_tx_verify(int a_argc, char **a_argv, char **a_str_reply) +int com_tx_verify(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; const char * l_tx_hash_str = NULL; dap_chain_net_t * l_net = NULL; dap_chain_t * l_chain = NULL; @@ -5857,8 +6453,9 @@ int com_tx_verify(int a_argc, char **a_argv, char **a_str_reply) * @param a_str_reply * @return int */ -int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) +int com_tx_history(int a_argc, char ** a_argv, void ** reply) { + json_object ** json_arr_reply = (json_object **) reply; int arg_index = 1; const char *l_addr_base58 = NULL; const char *l_wallet_name = NULL; @@ -5874,8 +6471,10 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Invalid parameter -H, valid values: -H <hex | base58>"); - return -1; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + "Invalid parameter -H, valid values: -H <hex | base58>"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR; + } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_base58); @@ -5887,47 +6486,51 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) bool l_is_tx_all = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-all", NULL); if (!l_addr_base58 && !l_wallet_name && !l_tx_hash_str && !l_is_tx_all) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-addr' or '-w' or '-tx'"); - return -1; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + "tx_history requires parameter '-addr' or '-w' or '-tx'"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR; } if (!l_net_str && !l_addr_base58&& !l_is_tx_all) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-net' or '-addr'"); - return -2; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + "tx_history requires parameter '-net' or '-addr'"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR; } dap_chain_hash_fast_t l_tx_hash; - if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "TX hash not recognized"); - return -3; + if (l_tx_hash_str && dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR, "tx hash not recognized"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR; } // Select chain network if (l_net_str) { l_net = dap_chain_net_by_name(l_net_str); if (!l_net) { // Can't find such network - dap_cli_server_cmd_set_reply_text(a_str_reply, - "tx_history requires parameter '-net' to be valid chain network name"); - return -3; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR, + "tx_history requires parameter '-net' to be valid chain network name"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR; } } // Get chain address dap_chain_addr_t *l_addr = NULL; if (l_addr_base58) { if (l_tx_hash_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Incomatible params '-addr' & '-tx'"); - return -4; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR, + "Incompatible params '-addr' & '-tx'"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR; } l_addr = dap_chain_addr_from_str(l_addr_base58); if (!l_addr) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Wallet address not recognized"); - return -5; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR, + "Wallet address not recognized"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR; } if (l_net) { if (l_net->pub.id.uint64 != l_addr->net_id.uint64) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Network ID with '-net' param and network ID with '-addr' param are different"); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR, + "Network ID with '-net' param and network ID with '-addr' param are different"); DAP_DELETE(l_addr); - return -6; + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR; } } else l_net = dap_chain_net_by_id(l_addr->net_id); @@ -5941,27 +6544,28 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_addr_t *l_addr_tmp = dap_chain_wallet_get_addr(l_wallet, l_net->pub.id); if (l_addr) { if (!dap_chain_addr_compare(l_addr, l_addr_tmp)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Address with '-addr' param and address with '-w' param are different"); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR, + "Address with '-addr' param and address with '-w' param are different"); DAP_DELETE(l_addr); DAP_DELETE(l_addr_tmp); - return -7; + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR; } DAP_DELETE(l_addr_tmp); } else l_addr = l_addr_tmp; dap_chain_wallet_close(l_wallet); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The wallet %s is not activated or it doesn't exist", l_wallet_name); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR, + "The wallet %s is not activated or it doesn't exist", l_wallet_name); DAP_DELETE(l_addr); - return -7; + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR; } } // Select chain, if any if (!l_net) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Could not determine the network from which to " + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR, "Could not determine the network from which to " "extract data for the tx_history command to work."); - return -9; + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR; } if (l_chain_str) l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_str); @@ -5969,83 +6573,59 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); if(!l_chain) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "tx_history requires parameter '-chain' to be valid chain name in chain net %s." - " You can set default datum type in chain configuration file", - l_net_str); - return -8; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR, + "tx_history requires parameter '-chain' to be valid chain name in chain net %s." + " You can set default datum type in chain configuration file", l_net_str); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR; } - char *l_str_out = NULL; + // response + json_object * json_obj_out = NULL; if (l_tx_hash_str) { - l_str_out = dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type); + // history tx hash + json_obj_out = dap_db_history_tx(&l_tx_hash, l_chain, l_hash_out_type, l_net); + if (!json_obj_out) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR, + "something went wrong in tx_history"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR; + } } else if (l_addr) { - l_str_out = dap_db_history_addr(l_addr, l_chain, l_hash_out_type); + // history addr and wallet + char *l_addr_str = dap_chain_addr_to_str(l_addr); + json_obj_out = dap_db_history_addr(l_addr, l_chain, l_hash_out_type, l_addr_str); + if (!json_obj_out) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR, + "something went wrong in tx_history"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR; + } } else if (l_is_tx_all) { - dap_time_t l_time_T = dap_time_now(); - char out[80] = {"\0"}; - dap_time_to_str_rfc822(out,80, l_time_T); - log_it(L_DEBUG, "Start getting tx from chain: %s", out); - dap_ledger_t *l_ledger = l_net->pub.ledger; - dap_string_t *l_tx_all_str = dap_string_new(""); - size_t l_tx_count = 0; - size_t l_tx_ledger_accepted = 0; - size_t l_tx_ledger_rejected = 0; - dap_chain_cell_t *l_cell = NULL, - *l_cell_tmp = NULL; - dap_chain_atom_iter_t *l_iter = NULL; - HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) { - l_iter = l_chain->callback_atom_iter_create(l_chain, l_cell->id, 0); - size_t l_atom_size = 0; - dap_chain_atom_ptr_t l_ptr = l_chain->callback_atom_iter_get_first(l_iter, &l_atom_size); - while (l_ptr && l_atom_size) { - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count); - for (size_t i = 0; i < l_datums_count; i++) { - if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) { - l_tx_count++; - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datums[i]->data; - dap_hash_fast_t l_ttx_hash = {0}; - dap_hash_fast(l_tx, l_datums[i]->header.data_size, &l_ttx_hash); - const char *l_token_ticker = NULL; - if ((l_token_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_ledger, &l_ttx_hash))) { - dap_string_append_printf(l_tx_all_str, "\t\t↓↓↓ Ledger accepted ↓↓↓\n"); - l_tx_ledger_accepted++; - } else { - l_token_ticker = s_tx_get_main_ticker(l_tx, l_net, NULL); - dap_string_append_printf(l_tx_all_str, "\t\t↓↓↓ Ledger rejected ↓↓↓\n"); - l_tx_ledger_rejected++; - } - dap_chain_datum_dump_tx(l_tx, l_token_ticker, l_tx_all_str, l_hash_out_type, &l_ttx_hash, l_net->pub.id); - } - } - DAP_DEL_Z(l_datums); - l_ptr = l_chain->callback_atom_iter_get_next(l_iter, &l_atom_size); - } - l_cell->chain->callback_atom_iter_delete(l_iter); + // history all + json_object * json_obj_summary = json_object_new_object(); + if (!json_obj_summary) { + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_MEMORY_ERR; + } + + json_object* json_arr_history_all = dap_db_history_tx_all(l_chain, l_net, l_hash_out_type, json_obj_summary); + if (!json_arr_history_all) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR, + "something went wrong in tx_history"); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR; } - l_time_T = dap_time_now(); - dap_time_to_str_rfc822(out,80, l_time_T); - log_it(L_DEBUG, "END getting tx from chain: %s", out); - dap_string_append_printf(l_tx_all_str, "Chain %s in network %s contains %zu transactions.\n" - "Of which %zu were accepted into the ledger and %zu were rejected.\n", - l_net->pub.name, l_chain->name, l_tx_count, l_tx_ledger_accepted, l_tx_ledger_rejected); - l_str_out = l_str_out ? dap_strdup_printf("%s%s", l_str_out, dap_strdup(l_tx_all_str->str)) : dap_strdup(l_tx_all_str->str); - dap_string_free(l_tx_all_str, true); + json_object_array_add(*json_arr_reply, json_arr_history_all); + json_object_array_add(*json_arr_reply, json_obj_summary); + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK; } - dap_string_t *l_str_ret = dap_string_new(""); - if (l_addr) { - char *l_addr_str = dap_chain_addr_to_str(l_addr); - dap_string_append_printf(l_str_ret, "%sHistory for addr %s:\n%s", l_sign_str, l_addr_str, l_str_out ? l_str_out : " empty"); - DAP_DELETE(l_addr_str); - DAP_DELETE(l_str_out); - } else - dap_string_append_printf(l_str_ret, "%s", l_str_out); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret->str); - dap_string_free(l_str_ret, true); - return 0; + if (json_obj_out) { + json_object_array_add(*json_arr_reply, json_obj_out); + } else { + json_object_array_add(*json_arr_reply, json_object_new_string("empty")); + } + + return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK; } + /** * @brief stats command * @@ -6055,8 +6635,9 @@ int com_tx_history(int a_argc, char ** a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_stats(int argc, char **a_argv, char **a_str_reply) +int com_stats(int argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_STATS_CPU }; @@ -6113,8 +6694,9 @@ int com_stats(int argc, char **a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_exit(int a_argc, char **a_argv, char **a_str_reply) +int com_exit(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; UNUSED(a_argc); UNUSED(a_argv); UNUSED(a_str_reply); @@ -6133,8 +6715,9 @@ int com_exit(int a_argc, char **a_argv, char **a_str_reply) * @param str_reply * @return int */ -int com_print_log(int a_argc, char **a_argv, char **a_str_reply) +int com_print_log(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; const char * l_str_ts_after = NULL; const char * l_str_limit = NULL; @@ -6175,8 +6758,9 @@ int com_print_log(int a_argc, char **a_argv, char **a_str_reply) * @param a_str_reply * @return */ -int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply) +int cmd_gdb_export(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; const char *l_filename = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "filename", &l_filename); @@ -6282,8 +6866,9 @@ int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply) * @param a_str_reply * @return */ -int cmd_gdb_import(int a_argc, char **a_argv, char ** a_str_reply) +int cmd_gdb_import(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; int arg_index = 1; const char *l_filename = NULL; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "filename", &l_filename); @@ -6385,8 +6970,9 @@ typedef struct _pvt_net_aliases_list{ size_t count_nodes; }_pvt_net_aliases_list_t; -int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply) +int cmd_remove(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; //default init const char *return_message = NULL; const char *l_gdb_path = NULL; @@ -6560,8 +7146,9 @@ struct opts { #define BUILD_BUG(condition) ((void)sizeof(char[1-2*!!(condition)])) -int com_signer(int a_argc, char **a_argv, char **a_str_reply) +int com_signer(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_SIGN, CMD_CHECK }; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 76f7603378451d6009b73e537fc25c7fbdd2b83a..1dc83f5d40ebe2143d65d27b04238200dd79c76f 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -46,6 +46,9 @@ #include "dap_chain_mempool.h" #include "dap_math_convert.h" +#include "dap_json_rpc_errors.h" +#include "dap_json_rpc_chain_datum_tx.h" + #define LOG_TAG "chain_node_cli_cmd_tx" #include "uthash.h" @@ -60,18 +63,13 @@ typedef struct dap_tx_data { dap_chain_addr_t addr; } dap_tx_data_t; -typedef struct dap_chain_tx_hash_processed_ht{ - dap_chain_hash_fast_t hash; - UT_hash_handle hh; -}dap_chain_tx_hash_processed_ht_t; - /** * @brief s_chain_tx_hash_processed_ht_free * free l_current_hash->hash, l_current_hash, l_hash_processed * @param l_hash_processed dap_chain_tx_hash_processed_ht_t */ -static void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed) +void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed) { if (!l_hash_processed || !*l_hash_processed) return; @@ -135,51 +133,96 @@ static bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, return true; } -/** - * @brief dap_db_history_tx - * Get data according the history log - * - * return history string - * @param a_tx_hash - * @param a_chain - * @param a_hash_out_type - * @return char* - */ -char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type) +json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, + dap_hash_fast_t * l_atom_hash, + dap_chain_datum_tx_t * l_tx, + dap_chain_t * a_chain, + const char *a_hash_out_type, + dap_chain_net_t * l_net, + int l_ret_code, + bool *accepted_tx) +{ + const char *l_tx_token_ticker = NULL; + json_object* json_obj_datum = json_object_new_object(); + if (!json_obj_datum) { + return NULL; + } + + dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; + l_tx_token_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_ledger, a_tx_hash); + if (l_tx_token_ticker) { + json_object_object_add(json_obj_datum, "status", json_object_new_string("ACCEPTED")); + *accepted_tx = true; + } else { + json_object_object_add(json_obj_datum, "status", json_object_new_string("DECLINED")); + *accepted_tx = false; + } + + if (l_atom_hash) { + char *l_atom_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_atom_hash) + : dap_chain_hash_fast_to_str_new(l_atom_hash); + json_object_object_add(json_obj_datum, "atom_hash", json_object_new_string(l_atom_hash_str)); + } + + char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(a_tx_hash) + : dap_chain_hash_fast_to_str_new(a_tx_hash); + json_object_object_add(json_obj_datum, "hash", json_object_new_string(l_hash_str)); + + json_object_object_add(json_obj_datum, "token_ticker", l_tx_token_ticker ? json_object_new_string(l_tx_token_ticker) + : json_object_new_null()); + + json_object_object_add(json_obj_datum, "ret_code", json_object_new_int(l_ret_code)); + json_object_object_add(json_obj_datum, "ret_code_str", json_object_new_string(dap_ledger_tx_check_err_str(l_ret_code))); + + char l_time_str[32]; + if (l_tx->header.ts_created) { + uint64_t l_ts = l_tx->header.ts_created; + dap_ctime_r(&l_ts, l_time_str); /* Convert ts to "Sat May 17 01:17:08 2014\n" */ + l_time_str[strlen(l_time_str)-1] = '\0'; /* Remove "\n"*/ + } + json_object *l_obj_ts_created = json_object_new_string(l_time_str); + json_object_object_add(json_obj_datum, "tx_created", l_obj_ts_created); + + json_object* datum_tx = dap_chain_datum_tx_to_json(l_tx); + json_object_object_add(json_obj_datum, "items", datum_tx); + + return json_obj_datum; +} + +json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, + dap_chain_t * a_chain, + const char *a_hash_out_type, + dap_chain_net_t * l_net) + { if (!a_chain->callback_datum_find_by_hash) { log_it(L_WARNING, "Not defined callback_datum_find_by_hash for chain \"%s\"", a_chain->name); return NULL; } - dap_string_t *l_str_out = dap_string_new(NULL); - dap_hash_fast_t l_atom_hash = {}; int l_ret_code = 0; + bool accepted_tx; + dap_hash_fast_t l_atom_hash = {0}; + //search tx dap_chain_datum_t *l_datum = a_chain->callback_datum_find_by_hash(a_chain, a_tx_hash, &l_atom_hash, &l_ret_code); dap_chain_datum_tx_t *l_tx = l_datum && l_datum->header.type_id == DAP_CHAIN_DATUM_TX ? (dap_chain_datum_tx_t *)l_datum->data : NULL; if (l_tx) { - char *l_atom_hash_str = dap_strcmp(a_hash_out_type, "hex") - ? dap_enc_base58_encode_hash_to_str(&l_atom_hash) - : dap_chain_hash_fast_to_str_new(&l_atom_hash); - dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; - const char *l_tx_token_ticker = dap_ledger_tx_get_token_ticker_by_hash(l_ledger, a_tx_hash); - dap_string_append_printf(l_str_out, "%s TX with atom %s (ret_code %d - %s)\n", l_tx_token_ticker ? "ACCEPTED" : "DECLINED", - l_atom_hash_str, l_ret_code, dap_ledger_tx_check_err_str(l_ret_code)); - DAP_DELETE(l_atom_hash_str); - dap_chain_datum_dump_tx(l_tx, l_tx_token_ticker, l_str_out, a_hash_out_type, a_tx_hash, a_chain->net_id); + return dap_db_tx_history_to_json(a_tx_hash, &l_atom_hash,l_tx, a_chain, a_hash_out_type, l_net, l_ret_code, &accepted_tx); } else { char *l_tx_hash_str = dap_strcmp(a_hash_out_type, "hex") ? dap_enc_base58_encode_hash_to_str(a_tx_hash) : dap_chain_hash_fast_to_str_new(a_tx_hash); - dap_string_append_printf(l_str_out, "TX hash %s not founds in chains", l_tx_hash_str); + dap_json_rpc_error_add(-1, "TX hash %s not founds in chains", l_tx_hash_str); DAP_DELETE(l_tx_hash_str); + return NULL; } - return l_str_out ? dap_string_free(l_str_out, false) : NULL; } -static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_processed_ht_t **a_tx_data_ht, +static void s_tx_header_print(json_object* json_obj_datum, dap_chain_tx_hash_processed_ht_t **a_tx_data_ht, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_atom_hash, const char *a_hash_out_type, dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash, int a_ret_code) @@ -189,7 +232,8 @@ static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_process char l_time_str[32] = "unknown"; /* Prefill string */ if (a_tx->header.ts_created) { uint64_t l_ts = a_tx->header.ts_created; - dap_ctime_r(&l_ts, l_time_str); /* Convert ts to Sat May 17 01:17:08 2014 */ + dap_ctime_r(&l_ts, l_time_str); /* Convert ts to "Sat May 17 01:17:08 2014\n" */ + l_time_str[strlen(l_time_str)-1] = '\0'; /* Remove "\n"*/ } dap_chain_tx_hash_processed_ht_t *l_tx_data = NULL; HASH_FIND(hh, *a_tx_data_ht, a_tx_hash, sizeof(*a_tx_hash), l_tx_data); @@ -215,16 +259,18 @@ static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_process l_tx_hash_str = dap_enc_base58_encode_hash_to_str(a_tx_hash); l_atom_hash_str = dap_enc_base58_encode_hash_to_str(a_atom_hash); } - char *l_err_code_str = l_declined ? dap_strdup_printf(" (ret code %d - %s)", - a_ret_code, dap_ledger_tx_check_err_str(a_ret_code)) : ""; - dap_string_append_printf(a_str_out, "%s TX hash %s with atom %s%s\n\t%s", l_declined ? "DECLINED" : "ACCEPTED", - l_tx_hash_str, l_atom_hash_str, l_err_code_str, l_time_str); - if (l_declined) - DAP_DEL_Z(l_err_code_str); + json_object_object_add(json_obj_datum, "status", json_object_new_string(l_declined ? "DECLINED" : "ACCEPTED")); + json_object_object_add(json_obj_datum, "hash", json_object_new_string(l_tx_hash_str)); + json_object_object_add(json_obj_datum, "atom_hash", json_object_new_string(l_atom_hash_str)); + json_object_object_add(json_obj_datum, "ret_code", json_object_new_int(a_ret_code)); + json_object_object_add(json_obj_datum, "ret_code_str", json_object_new_string(dap_ledger_tx_check_err_str(a_ret_code))); + json_object_object_add(json_obj_datum, "tx_created", json_object_new_string(l_time_str)); + DAP_DELETE(l_tx_hash_str); DAP_DELETE(l_atom_hash_str); } + /** * @brief dap_db_history_addr * Get data according the history log @@ -235,28 +281,40 @@ static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_process * @param a_hash_out_type * @return char* */ -char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const char *a_hash_out_type) +json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, + const char *a_hash_out_type, const char * l_addr_str) { struct token_addr { const char token[DAP_CHAIN_TICKER_SIZE_MAX]; dap_chain_addr_t addr; }; - dap_string_t *l_str_out = dap_string_new(NULL); - if (!l_str_out) { + json_object* json_obj_datum = json_object_new_array(); + if (!json_obj_datum){ log_it(L_CRITICAL, "Memory allocation error"); + dap_json_rpc_error_add(-44, "Memory allocation error"); return NULL; } + + // add address + json_object * json_obj_addr = json_object_new_object(); + json_object_object_add(json_obj_addr, "address", json_object_new_string(l_addr_str)); + json_object_array_add(json_obj_datum, json_obj_addr); + dap_chain_tx_hash_processed_ht_t *l_tx_data_ht = NULL; dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); if (!l_net) { log_it(L_WARNING, "Can't find net by specified chain %s", a_chain->name); + dap_json_rpc_error_add(-1, "Can't find net by specified chain %s", a_chain->name); + json_object_put(json_obj_datum); return NULL; } dap_ledger_t *l_ledger = l_net->pub.ledger; const char *l_native_ticker = l_net->pub.native_ticker; if (!a_chain->callback_datum_iter_create) { log_it(L_WARNING, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name); + dap_json_rpc_error_add(-1, "Not defined callback_datum_iter_create for chain \"%s\"", a_chain->name); + json_object_put(json_obj_datum); return NULL; } // load transactions @@ -345,6 +403,14 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const bool l_header_printed = false; uint256_t l_fee_sum = {}; dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_OUT_ALL, NULL); + json_object * j_arr_data = json_object_new_array(); + json_object * j_obj_tx = json_object_new_object(); + if (!j_obj_tx || !j_arr_data) { + dap_json_rpc_allocation_error; + json_object_put(j_obj_tx); + json_object_put(j_arr_data); + return NULL; + } for (dap_list_t *it = l_list_out_items; it; it = it->next) { dap_chain_addr_t *l_dst_addr = NULL; uint8_t l_type = *(uint8_t *)it->data; @@ -364,7 +430,7 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const case TX_ITEM_TYPE_OUT_COND: l_value = ((dap_chain_tx_out_cond_t *)it->data)->header.value; if (((dap_chain_tx_out_cond_t *)it->data)->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { - l_fee_sum = ((dap_chain_tx_out_cond_t *)it->data)->header.value; + SUM_256_256(l_fee_sum, ((dap_chain_tx_out_cond_t *)it->data)->header.value, &l_fee_sum); l_dst_token = l_native_ticker; } else l_dst_token = l_src_token; @@ -376,8 +442,9 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const continue; // sent to self (coinback) if (l_src_addr && dap_chain_addr_compare(l_src_addr, a_addr) && dap_strcmp(l_dst_token, l_noaddr_token)) { + if (!l_header_printed) { - s_tx_header_print(l_str_out, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash, + s_tx_header_print(j_obj_tx, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash, a_hash_out_type, l_ledger, &l_tx_hash, l_datum_iter->ret_code); l_header_printed = true; } @@ -386,11 +453,21 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const ((dap_chain_tx_out_cond_t *)it->data)->header.subtype); char *l_value_str = dap_chain_balance_print(l_value); char *l_coins_str = dap_chain_balance_to_coins(l_value); - dap_string_append_printf(l_str_out, "\tsend %s (%s) %s to %s\n", - l_coins_str, - l_value_str, - l_dst_token ? l_dst_token : "UNKNOWN", - l_dst_addr_str); + json_object * j_obj_data = json_object_new_object(); + if (!j_obj_data) { + dap_json_rpc_allocation_error; + json_object_put(j_arr_data); + json_object_put(j_obj_tx); + return NULL; + } + json_object_object_add(j_obj_data, "tx_type", json_object_new_string("send")); + json_object_object_add(j_obj_data, "send_coins", json_object_new_string(l_coins_str)); + json_object_object_add(j_obj_data, "send_datoshi", json_object_new_string(l_value_str)); + json_object_object_add(j_obj_data, "token", l_dst_token ? json_object_new_string(l_dst_token) + : json_object_new_string("UNKNOWN")); + json_object_object_add(j_obj_data, "destination_address", json_object_new_string(l_dst_addr_str)); + + json_object_array_add(j_arr_data, j_obj_data); if (l_dst_addr) DAP_DELETE(l_dst_addr_str); DAP_DELETE(l_value_str); @@ -398,7 +475,7 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const } if (l_dst_addr && dap_chain_addr_compare(l_dst_addr, a_addr)) { if (!l_header_printed) { - s_tx_header_print(l_str_out, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash, + s_tx_header_print(j_obj_tx, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash, a_hash_out_type, l_ledger, &l_tx_hash, l_datum_iter->ret_code); l_header_printed = true; } @@ -411,36 +488,118 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const l_src_str = dap_chain_tx_out_cond_subtype_to_str(l_src_subtype); char *l_value_str = dap_chain_balance_print(l_value); char *l_coins_str = dap_chain_balance_to_coins(l_value); - dap_string_append_printf(l_str_out, "\trecv %s (%s) %s from %s\n", - l_coins_str, - l_value_str, - l_dst_token ? l_dst_token : "UNKNOWN", - l_src_str); + json_object * j_obj_data = json_object_new_object(); + if (!j_obj_data) { + dap_json_rpc_allocation_error; + json_object_put(j_arr_data); + json_object_put(j_obj_tx); + return NULL; + } + json_object_object_add(j_obj_data, "tx_type", json_object_new_string("recv")); + json_object_object_add(j_obj_data, "recv_coins", json_object_new_string(l_coins_str)); + json_object_object_add(j_obj_data, "recv_datoshi", json_object_new_string(l_value_str)); + json_object_object_add(j_obj_data, "token", l_dst_token ? json_object_new_string(l_dst_token) + : json_object_new_string("UNKNOWN")); + json_object_object_add(j_obj_data, "source_address", json_object_new_string(l_src_str)); + json_object_array_add(j_arr_data, j_obj_data); DAP_DEL_Z(l_src_addr_str); DAP_DELETE(l_value_str); DAP_DELETE(l_coins_str); } } + if (json_object_array_length(j_arr_data) > 0) { + json_object_object_add(j_obj_tx, "data", j_arr_data); + } dap_list_free(l_list_out_items); // fee for base TX in native token - if (l_header_printed && - (l_base_tx || !dap_strcmp(l_native_ticker, l_noaddr_token)) && - !dap_strcmp(l_native_ticker, l_src_token)) { + if (l_header_printed && l_base_tx && !dap_strcmp(l_native_ticker, l_src_token)) { + json_object * j_obj_fee = json_object_new_object(); + json_object * j_arr_fee = json_object_new_array(); + if (!j_arr_fee || !j_obj_fee) { + dap_json_rpc_allocation_error; + json_object_put(j_arr_data); + json_object_put(j_obj_tx); + return NULL; + } char *l_fee_value_str = dap_chain_balance_print(l_fee_sum); char *l_fee_coins_str = dap_chain_balance_to_coins(l_fee_sum); - dap_string_append_printf(l_str_out, "\tpay %s (%s) fee\n", - l_fee_value_str, l_fee_coins_str); + json_object_object_add(j_obj_fee, "fee", json_object_new_string(l_fee_coins_str));; + json_object_object_add(j_obj_fee, "fee_datoshi", json_object_new_string(l_fee_value_str)); + json_object_array_add(j_arr_fee, j_obj_fee); + json_object_object_add(j_obj_tx, "fee", j_arr_fee); DAP_DELETE(l_fee_value_str); DAP_DELETE(l_fee_coins_str); } + if (json_object_object_length(j_obj_tx) > 0) { + json_object_array_add(json_obj_datum, j_obj_tx); + } } a_chain->callback_datum_iter_delete(l_datum_iter); // delete hashes s_dap_chain_tx_hash_processed_ht_free(&l_tx_data_ht); // if no history - if(!l_str_out->len) - dap_string_append(l_str_out, "\tempty"); - return l_str_out ? dap_string_free(l_str_out, false) : NULL; + if (json_object_array_length(json_obj_datum) == 1) { + json_object * json_empty_tx = json_object_new_object(); + if (!json_empty_tx) { + dap_json_rpc_allocation_error; + json_object_put(json_obj_datum); + return NULL; + } + json_object_object_add(json_empty_tx, "status", json_object_new_string("empty")); + json_object_array_add(json_obj_datum, json_empty_tx); + } + return json_obj_datum; +} + +json_object* dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t* l_net, const char *l_hash_out_type, json_object * json_obj_summary) { + log_it(L_DEBUG, "Start getting tx from chain"); + size_t l_tx_count = 0; + size_t l_tx_ledger_accepted = 0; + size_t l_tx_ledger_rejected = 0; + dap_chain_cell_t *l_cell = NULL, + *l_cell_tmp = NULL; + dap_chain_atom_iter_t *l_iter = NULL; + json_object * json_arr_out = json_object_new_array(); + HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) { + l_iter = l_chain->callback_atom_iter_create(l_chain, l_cell->id, 0); + size_t l_atom_size = 0; + dap_chain_atom_ptr_t l_ptr = l_chain->callback_atom_iter_get_first(l_iter, &l_atom_size); + while (l_ptr && l_atom_size) { + size_t l_datums_count = 0; + dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count); + for (size_t i = 0; i < l_datums_count; i++) { + if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) { + l_tx_count++; + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datums[i]->data; + dap_hash_fast_t l_ttx_hash = {0}; + dap_hash_fast(l_tx, l_datums[i]->header.data_size, &l_ttx_hash); + bool accepted_tx; + json_object* json_obj_datum = dap_db_tx_history_to_json(&l_ttx_hash, NULL, l_tx, l_chain, l_hash_out_type, l_net, 0, &accepted_tx); + if (!json_obj_datum) { + log_it(L_CRITICAL, "Memory allocation error"); + return NULL; + } + if (accepted_tx) + l_tx_ledger_accepted++; + else + l_tx_ledger_rejected++; + json_object_array_add(json_arr_out, json_obj_datum); + const char * debug_json_string = json_object_to_json_string(json_obj_datum); + } + } + DAP_DEL_Z(l_datums); + l_ptr = l_chain->callback_atom_iter_get_next(l_iter, &l_atom_size); + } + l_cell->chain->callback_atom_iter_delete(l_iter); + } + log_it(L_DEBUG, "END getting tx from chain"); + + json_object_object_add(json_obj_summary, "network", json_object_new_string(l_net->pub.name)); + json_object_object_add(json_obj_summary, "chain", json_object_new_string(l_chain->name)); + json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(l_tx_count)); + json_object_object_add(json_obj_summary, "accepted_tx", json_object_new_int(l_tx_ledger_accepted)); + json_object_object_add(json_obj_summary, "rejected_tx", json_object_new_int(l_tx_ledger_rejected)); + return json_arr_out; } /** @@ -688,8 +847,9 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger * @param a_str_reply * @return int */ -int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) +int com_ledger(int a_argc, char ** a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_LIST, CMD_LEDGER_HISTORY, CMD_TX_INFO }; int arg_index = 1; const char *l_addr_base58 = NULL; @@ -955,8 +1115,9 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) * @param a_str_reply * @return int */ -int com_token(int a_argc, char ** a_argv, char **a_str_reply) +int com_token(int a_argc, char ** a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_LIST, CMD_INFO, CMD_TX }; int arg_index = 1; const char *l_net_str = NULL; @@ -1203,8 +1364,9 @@ static dap_chain_datum_anchor_t * s_sign_anchor_in_cycle(dap_cert_t ** a_certs, } // Decree commands handlers -int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply) +int cmd_decree(int a_argc, char **a_argv, void ** reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE=0, CMD_CREATE, CMD_SIGN, CMD_ANCHOR, CMD_FIND, CMD_INFO }; enum { TYPE_NONE=0, TYPE_COMMON, TYPE_SERVICE}; enum { SUBTYPE_NONE=0, SUBTYPE_FEE, SUBTYPE_OWNERS, SUBTYPE_MIN_OWNERS, SUBTYPE_IP_BAN}; diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h index e4b97ef567babf57cefefdbb2d3cc091e6e5d707..040e4b3b5549dbd6652a930a06f166b391c5b77c 100644 --- a/modules/net/include/dap_chain_node_cli_cmd.h +++ b/modules/net/include/dap_chain_node_cli_cmd.h @@ -29,6 +29,12 @@ #include "dap_chain_net.h" #include "dap_chain_node.h" #include "dap_chain_node_cli.h" +#include "json.h" + +int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(int *a_arg_index, int a_argc, + char **a_argv, + dap_chain_t **a_chain, dap_chain_net_t **a_net); + int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int a_argc, char **a_argv, char ** a_str_reply, dap_chain_t ** a_chain, dap_chain_net_t ** a_net); @@ -36,12 +42,12 @@ int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int a_argc, c /** * global_db command */ -int com_global_db(int a_argc, char **a_argv, char **a_str_reply); +int com_global_db(int a_argc, char **a_argv, void **reply); /** * Node command */ -int com_node(int a_argc, char **a_argv, char **a_str_reply); +int com_node(int a_argc, char **a_argv, void **reply); #ifndef DAP_OS_ANDROID /** @@ -49,50 +55,50 @@ int com_node(int a_argc, char **a_argv, char **a_str_reply); * * return 0 OK, -1 Err */ -int com_traceroute(int a_argc, char** argv, char **a_str_reply); +int com_traceroute(int a_argc, char** argv, void **reply); /** * Tracepath command * * return 0 OK, -1 Err */ -int com_tracepath(int a_argc, char** argv, char **a_str_reply); +int com_tracepath(int a_argc, char** argv, void **reply); /** * Ping command * * return 0 OK, -1 Err */ -int com_ping(int a_argc, char** argv, char **a_str_reply); +int com_ping(int a_argc, char** argv, void **reply); #endif /** * Help command */ -int com_help(int a_argc, char **a_argv, char **a_str_reply); +int com_help(int a_argc, char **a_argv, void **reply); -int com_version(int a_argc, char **a_argv, char **a_str_reply); +int com_version(int a_argc, char **a_argv, void **reply); /** * Token declaration */ -int com_token_decl(int a_argc, char **a_argv, char ** str_reply); +int com_token_decl(int a_argc, char **a_argv, void **reply); -int com_token_update(int a_argc, char **a_argv, char ** a_str_reply); +int com_token_update(int a_argc, char **a_argv, void ** reply); /** * Token declaration add sign */ -int com_token_decl_sign ( int a_argc, char **a_argv, char ** str_reply); +int com_token_decl_sign ( int a_argc, char **a_argv, void **reply); /* * Token update sign */ -int com_token_update_sign(int argc, char ** argv, char ** a_str_reply); +int com_token_update_sign(int argc, char ** argv, void ** reply); /** * Token emission */ -int com_token_emit (int a_argc, char **a_argv, char ** str_reply); +int com_token_emit (int a_argc, char **a_argv, void **reply); /** @@ -100,49 +106,83 @@ int com_token_emit (int a_argc, char **a_argv, char ** str_reply); * * Wallet info */ -int com_tx_wallet(int a_argc, char **a_argv, char **a_str_reply); +int com_tx_wallet(int a_argc, char **a_argv, void **reply); /** * com_tx_create command * * Create transaction */ -int com_tx_create(int a_argc, char **a_argv, char **a_str_reply); -int com_tx_create_json(int a_argc, char **a_argv, char **a_str_reply); -int com_tx_cond_create(int a_argc, char **a_argv, char **a_str_reply); +int com_tx_create(int a_argc, char **a_argv, void **reply); +int com_tx_create_json(int a_argc, char **a_argv, void **reply); +int com_tx_cond_create(int a_argc, char **a_argv, void **reply); /** * tx_verify command * * Verifing transaction */ -int com_tx_verify(int a_argc, char ** a_argv, char **a_str_reply); +int com_tx_verify(int a_argc, char ** a_argv, void **reply); + +typedef enum s_com_tx_history_err{ + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_OK = 0, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_MEMORY_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_HASH_REC_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_INCOMPATIBLE_PARAMS_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ADDR_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ID_NET_ADDR_DIF_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_ADDR_WALLET_DIF_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_WALLET_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_NET_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_CHAIN_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_TX_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR, + DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ALL_ERR, + + /* add custom codes here */ + + DAP_CHAIN_NODE_CLI_COM_TX_UNKNOWN /* MAX */ +} s_com_tx_history_err_t; + +char *dap_chain_node_cli_com_tx_history_err(int a_code); /** * tx_history command * * Transaction history for an address */ -int com_tx_history(int a_argc, char **a_argv, char **a_str_reply); +int com_tx_history(int a_argc, char ** a_argv, void ** reply); + // Print log info -int com_print_log(int a_argc, char **a_argv, char **a_str_reply); +int com_print_log(int a_argc, char **a_argv, void **reply); // Print statistics -int com_stats(int a_argc, char **a_argv, char **a_str_reply); +int com_stats(int a_argc, char **a_argv, void **reply); -int com_exit(int a_argc, char **a_argv, char **a_str_reply); +int com_exit(int a_argc, char **a_argv, void **reply); -int cmd_gdb_import(int a_argc, char **a_argv, char **a_str_reply); -int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply); +int cmd_gdb_import(int a_argc, char **a_argv, void **reply); +int cmd_gdb_export(int a_argc, char **a_argv, void **reply); -int com_mempool(int a_argc, char **a_argv, char **a_str_reply); +typedef enum cmd_mempool_list_err{ + DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_OK = 0, + DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_READ_EMISSION, + DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CHAIN_NOT_FOUND, + DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_CAN_NOT_GET_MEMPOOL_GROUP, + /* add custom codes here */ + + DAP_CHAIN_NODE_CLI_COM_MEMPOOL_LIST_UNKNOWN /* MAX */ +} cmd_mempool_list_err_t; +int com_mempool(int a_argc, char **a_argv, void **reply); /** * Place public CA into the mempool */ -int com_mempool_add_ca( int a_argc, char **a_argv, char **a_str_reply); -int com_chain_ca_pub( int a_argc, char **a_argv, char **a_str_reply); -int com_chain_ca_copy( int a_argc, char **a_argv, char **a_str_reply); -int com_signer(int a_argc, char **a_argv, char **a_str_reply); +int com_chain_ca_pub( int a_argc, char **a_argv, void ** reply); +int com_chain_ca_copy( int a_argc, char **a_argv, void ** reply); +int com_signer(int a_argc, char **a_argv, void ** reply); //remove func -int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply); +int cmd_remove(int a_argc, char **a_argv, void ** reply); + diff --git a/modules/net/include/dap_chain_node_cli_cmd_tx.h b/modules/net/include/dap_chain_node_cli_cmd_tx.h index 00023c9606ca5636840993efab7af549dd90bc08..3b196a652b3078796d152edcde6bd5d20a247b61 100644 --- a/modules/net/include/dap_chain_node_cli_cmd_tx.h +++ b/modules/net/include/dap_chain_node_cli_cmd_tx.h @@ -22,30 +22,50 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ +#pragma once + #include "dap_chain.h" #include "dap_chain_common.h" +#include "json.h" + +typedef struct dap_chain_tx_hash_processed_ht{ + dap_chain_hash_fast_t hash; + UT_hash_handle hh; +}dap_chain_tx_hash_processed_ht_t; + +void s_dap_chain_tx_hash_processed_ht_free(dap_chain_tx_hash_processed_ht_t **l_hash_processed); /** * - * return history string + * return history json */ -char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type); -char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type); +json_object * dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, const char *a_hash_out_type, dap_chain_net_t * l_net); +json_object * dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, const char *a_hash_out_type, const char * l_addr_str); +json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, + dap_hash_fast_t * l_atom_hash, + dap_chain_datum_tx_t * l_tx, + dap_chain_t * a_chain, + const char *a_hash_out_type, + dap_chain_net_t * l_net, + int l_ret_code, + bool *accepted_tx); +json_object* dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t* l_net, const char *l_hash_out_type, json_object * json_obj_summary); /** * ledger command * */ -int com_ledger(int a_argc, char ** a_argv, char **a_str_reply); +int com_ledger(int a_argc, char ** a_argv, void **reply); /** * token command * */ -int com_token(int a_argc, char ** a_argv, char **a_str_reply); +int com_token(int a_argc, char ** a_argv, void **reply); /** * decree command * */ -int cmd_decree(int a_argc, char **a_argv, char ** a_str_reply); +int cmd_decree(int a_argc, char **a_argv, void ** reply); + diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index ef7885414f357cfa75f7ac529e316503250468db..afdc23e0639a9c6054be2016d2502546f9dc0229 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -34,7 +34,7 @@ #define LOG_TAG "chain_net_srv_datum" static dap_chain_net_srv_t *s_srv_datum = NULL; -static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply); +static int s_srv_datum_cli(int argc, char ** argv, void **reply); void s_order_notficator(dap_store_obj_t *a_obj, void *a_arg); @@ -102,7 +102,8 @@ char* dap_chain_net_srv_datum_custom_add(dap_chain_t * a_chain, const uint8_t *a return l_hash_str; } -static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply) { +static int s_srv_datum_cli(int argc, char ** argv, void **reply) { + char ** a_str_reply = (char **) reply; int ret = -666; int arg_index = 1; dap_chain_net_t * l_chain_net = NULL; diff --git a/modules/service/stake/dap_chain_net_srv_stake_lock.c b/modules/service/stake/dap_chain_net_srv_stake_lock.c index a925a6bdb78b2d746d622afffa40fd6d306fecc4..292d88b50a2e55c883b845ed3f967ea7c8c3d946 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake/dap_chain_net_srv_stake_lock.c @@ -91,7 +91,7 @@ typedef struct dap_ledger_token_emission_for_stake_lock_item { #define MONTH_INDEX 8 #define YEAR_INDEX 12 -static int s_cli_stake_lock(int a_argc, char **a_argv, char **a_str_reply); +static int s_cli_stake_lock(int a_argc, char **a_argv, void ** reply); // Create stake lock datum static dap_chain_datum_t *s_stake_lock_datum_create(dap_chain_net_t *a_net, dap_enc_key_t *a_key_from, @@ -690,8 +690,9 @@ static void s_error_handler(enum error_code errorCode, dap_string_t *output_line * @param a_str_reply * @return */ -static int s_cli_stake_lock(int a_argc, char **a_argv, char **a_str_reply) +static int s_cli_stake_lock(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum{ CMD_NONE, CMD_HOLD, CMD_TAKE }; diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 130d6ed21da3eaa9d4626a485a5088df04515d58..7c86ae118feccae149f97ff563845427ecbc726e 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -43,7 +43,7 @@ #define DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_GDB_GROUP "delegate_keys" -static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply); +static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply); static bool s_stake_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx_in, bool a_owner); @@ -1593,8 +1593,9 @@ uint256_t dap_chain_net_srv_stake_get_total_weight(dap_chain_net_id_t a_net_id) return l_total_weight; } -static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) +static int s_cli_srv_stake(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum { CMD_NONE, CMD_ORDER, CMD_DELEGATE, CMD_APPROVE, CMD_LIST, CMD_INVALIDATE, CMD_MIN_VALUE, CMD_CHECK }; diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c index 0e1f171d23710f4a51cf2843c211314ae8069cd5..19a5edaa4ef2dc77aa92d43a3d6b14aaee701f78 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c @@ -31,8 +31,9 @@ static void add_value_text(dap_string_t *l_str, char *l_addstr, uintmax_t a_valu * * VPN statistics */ -int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply) +int com_vpn_statistics(int a_argc, char ** a_argv, void **reply) { + char ** a_str_reply = (char **) reply; // get statistics for all actual sessions dap_list_t *l_sessions_list = dap_stream_session_get_list_sessions(), *l_item; dap_string_t *l_str = dap_string_new(NULL); @@ -91,8 +92,9 @@ int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply) * * VPN client control */ -int com_vpn_client(int a_argc, char ** a_argv, char **a_str_reply) +int com_vpn_client(int a_argc, char ** a_argv, void **reply) { + char ** a_str_reply = (char **) reply; #ifndef _WIN32 enum { CMD_NONE, CMD_INIT, CMD_START, CMD_STOP, CMD_STATUS, CMD_CHECK, CMD_CHECK_RESULT diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h index e0048f944d583e84e6cdd1e126d47e5112de864e..590dd452185a1d7d726941d4e422d980b47b4a75 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.h @@ -1,6 +1,6 @@ #pragma once // VPN statistics -int com_vpn_statistics(int a_argc, char ** a_argv, char **a_str_reply); +int com_vpn_statistics(int a_argc, char ** a_argv, void **reply); // vpn_client command -int com_vpn_client(int a_argc, char ** a_argv, char **a_str_reply); +int com_vpn_client(int a_argc, char ** a_argv, void **reply); diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index 66ff3ee56c63dcc92f4ba6c2fc5056faab90b2a4..1b8092ffa840bbc09dfcaf11cb1c8933437e4ba0 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -72,7 +72,7 @@ static bool s_xchange_verificator_callback(dap_ledger_t * a_ledger, dap_chain_tx const dap_chain_net_srv_uid_t c_dap_chain_net_srv_xchange_uid = {.uint64= DAP_CHAIN_NET_SRV_XCHANGE_ID}; -static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply); +static int s_cli_srv_xchange(int a_argc, char **a_argv, void **reply); static int s_callback_requested(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size); static int s_callback_response_success(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size); static int s_callback_response_error(dap_chain_net_srv_t *a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_remote_t *a_srv_client, const void *a_data, size_t a_data_size); @@ -1738,8 +1738,9 @@ void s_tx_is_order_check(dap_chain_net_t *a_net, dap_chain_datum_tx_t *a_tx, voi *l_tx_list_ptr = dap_list_append(*l_tx_list_ptr, a_tx); } -static int s_cli_srv_xchange(int a_argc, char **a_argv, char **a_str_reply) +static int s_cli_srv_xchange(int a_argc, char **a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum {CMD_NONE = 0, CMD_ORDER, CMD_ORDERS, CMD_PURCHASE, CMD_ENABLE, CMD_DISABLE, CMD_TX_LIST, CMD_TOKEN_PAIR }; int l_arg_index = 1, l_cmd_num = CMD_NONE; bool l_rc; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index c1dfc9207523900b178a79fc9b2005be5c23fe6d..02f96dc2f8a2125cdb20c8cfd73b2dfe909fdce5 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -84,7 +84,7 @@ typedef struct dap_chain_cs_blocks_pvt static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, char **a_str_reply,const char * a_param, dap_chain_hash_fast_t * a_datum_hash); static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta); -static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply); +static int s_cli_blocks(int a_argc, char ** a_argv, void **reply); // Setup BFT consensus and select the longest chunk static void s_bft_consensus_setup(dap_chain_cs_blocks_t * a_blocks); @@ -504,8 +504,9 @@ static void s_print_autocollect_table(dap_chain_net_t *a_net, dap_string_t *a_re * @param a_str_reply * @return */ -static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) +static int s_cli_blocks(int a_argc, char ** a_argv, void **reply) { + char ** a_str_reply = (char **) reply; enum { SUBCMD_UNDEFINED =0, SUBCMD_NEW_FLUSH, diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 3a71be2a2d1e53cc11450aead8951a5a540d06f2..6ab3260bcf88b4e4b579407cc7806cd690804cfe 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -131,7 +131,7 @@ static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t *a_datum_i static dap_chain_datum_t *s_chain_callback_datum_iter_get_first(dap_chain_datum_iter_t *a_datum_iter); // Get the fisrt datum from dag static dap_chain_datum_t *s_chain_callback_datum_iter_get_next(dap_chain_datum_iter_t *a_datum_iter); // Get the next datum from dag -static int s_cli_dag(int argc, char ** argv, char **str_reply); +static int s_cli_dag(int argc, char ** argv, void **reply); void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_item_t * a_event_item); static size_t s_dap_chain_callback_get_count_tx(dap_chain_t *a_chain); @@ -1436,8 +1436,9 @@ static dap_chain_datum_t *s_chain_callback_datum_iter_get_next(dap_chain_datum_i * @param str_reply * @return */ -static int s_cli_dag(int argc, char ** argv, char **a_str_reply) +static int s_cli_dag(int argc, char ** argv, void **reply) { + char ** a_str_reply = (char **) reply; enum { SUBCMD_EVENT_CREATE, SUBCMD_EVENT_CANCEL,