Monero C++ Library
monero_utils.h
1
53#pragma once
54
55#ifndef monero_utils_h
56#define monero_utils_h
57
58#include "wallet/monero_wallet_model.h"
59#include "cryptonote_basic/cryptonote_basic.h"
60#include "serialization/keyvalue_serialization.h" // TODO: consolidate with other binary deps?
61#include "storages/portable_storage.h"
62
66namespace monero_utils
67{
68 using namespace cryptonote;
69
70 // ------------------------------ CONSTANTS ---------------------------------
71
72 static const int RING_SIZE = 12; // network-enforced ring size
73
74 // -------------------------------- UTILS -----------------------------------
75
76 monero_integrated_address get_integrated_address(monero_network_type network_type, const std::string& standard_address, const std::string& payment_id);
77 bool is_valid_address(const std::string& address, monero_network_type network_type);
78 bool is_valid_private_view_key(const std::string& private_view_key);
79 bool is_valid_private_spend_key(const std::string& private_spend_key);
80 void validate_address(const std::string& address, monero_network_type network_type);
81 void validate_private_view_key(const std::string& private_view_key);
82 void validate_private_spend_key(const std::string& private_spend_key);
83 void json_to_binary(const std::string &json, std::string &bin);
84 void binary_to_json(const std::string &bin, std::string &json);
85 void binary_blocks_to_json(const std::string &bin, std::string &json);
86
87 // ------------------------------ RAPIDJSON ---------------------------------
88
89 std::string serialize(const rapidjson::Document& doc);
90
96 template <class T>
97 void add_json_member(std::string key, T val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root, rapidjson::Value& field) {
98 rapidjson::Value field_key(key.c_str(), key.size(), allocator);
99 field.SetInt64((uint64_t) val);
100 root.AddMember(field_key, field, allocator);
101 }
102 void add_json_member(std::string key, std::string val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root, rapidjson::Value& field);
103 void add_json_member(std::string key, bool val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root);
104
105 // TODO: template implementation here, could move to monero_utils.hpp per https://stackoverflow.com/questions/3040480/c-template-function-compiles-in-header-but-not-implementation
106 template <class T> rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<std::shared_ptr<T>>& vals) {
107 rapidjson::Value value_arr(rapidjson::kArrayType);
108 for (const auto& val : vals) {
109 value_arr.PushBack(val->to_rapidjson_val(allocator), allocator);
110 }
111 return value_arr;
112 }
113
114 // TODO: template implementation here, could move to monero_utils.hpp per https://stackoverflow.com/questions/3040480/c-template-function-compiles-in-header-but-not-implementation
115 template <class T> rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<T>& vals) {
116 rapidjson::Value value_arr(rapidjson::kArrayType);
117 for (const auto& val : vals) {
118 value_arr.PushBack(val.to_rapidjson_val(allocator), allocator);
119 }
120 return value_arr;
121 }
122
123 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<std::string>& strs);
124 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<uint8_t>& nums);
125 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<uint32_t>& nums);
126 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator, const std::vector<uint64_t>& nums);
127
128 // ------------------------ PROPERTY TREES ---------------------------
129
130 // TODO: fully switch from property trees to rapidjson
131
132 std::string serialize(const boost::property_tree::ptree& node);
133 void deserialize(const std::string& json, boost::property_tree::ptree& root);
134
135 // --------------------------------------------------------------------------
136
143 bool is_valid_language(const std::string& language);
144
151 std::shared_ptr<monero_block> cn_block_to_block(const cryptonote::block& cn_block);
152
160 std::shared_ptr<monero_tx> cn_tx_to_tx(const cryptonote::transaction& cn_tx, bool init_as_tx_wallet = false);
161
167 static std::string get_pruned_tx_json(cryptonote::transaction &tx)
168 {
169 std::stringstream ss;
170 json_archive<true> ar(ss);
171 bool r = tx.serialize_base(ar);
172 CHECK_AND_ASSERT_MES(r, std::string(), "Failed to serialize rct signatures base");
173 return ss.str();
174 }
175
181 static void free(std::shared_ptr<monero_block> block) {
182 for (std::shared_ptr<monero_tx>& tx : block->m_txs) {
183 tx->m_block.reset();
184 monero_tx_wallet* tx_wallet = dynamic_cast<monero_tx_wallet*>(tx.get());
185 if (tx_wallet != nullptr) {
186 if (tx_wallet->m_outgoing_transfer != boost::none) tx_wallet->m_outgoing_transfer.get()->m_tx.reset();
187 for (std::shared_ptr<monero_transfer> transfer : tx_wallet->m_incoming_transfers) transfer->m_tx.reset();
188 for (std::shared_ptr<monero_output> output : tx_wallet->m_outputs) output->m_tx.reset();
189 for (std::shared_ptr<monero_output> input : tx_wallet->m_inputs) {
190 input->m_key_image.reset();
191 input->m_tx.reset();
192 }
193 }
194 }
195 block.reset();
196 }
197
203 static void free(std::vector<std::shared_ptr<monero_block>> blocks) {
204 for (std::shared_ptr<monero_block>& block : blocks) monero_utils::free(block);
205 }
206}
207#endif /* monero_utils_h */
Definition: monero_utils.h:67
bool is_valid_language(const std::string &language)
Definition: monero_utils.cpp:295
std::shared_ptr< monero_block > cn_block_to_block(const cryptonote::block &cn_block)
Definition: monero_utils.cpp:308
void add_json_member(std::string key, T val, rapidjson::Document::AllocatorType &allocator, rapidjson::Value &root, rapidjson::Value &field)
Definition: monero_utils.h:97
std::shared_ptr< monero_tx > cn_tx_to_tx(const cryptonote::transaction &cn_tx, bool init_as_tx_wallet=false)
Definition: monero_utils.cpp:324
monero_network_type
Definition: monero_daemon_model.h:90
Definition: monero_wallet_model.h:353
Definition: monero_wallet_model.h:274