68 using namespace cryptonote;
72 static const int RING_SIZE = 16;
73 static const uint64_t XMR_AU_MULTIPLIER = 1000000000000ULL;
77 void set_log_level(
int level);
78 void set_log_categories(
const std::string& categories);
79 void configure_logging(
const std::string& path,
bool console);
83 bool is_valid_private_view_key(
const std::string& private_view_key);
84 bool is_valid_private_spend_key(
const std::string& private_spend_key);
85 bool is_valid_public_view_key(
const std::string& public_view_key);
86 bool is_valid_public_spend_key(
const std::string& public_spend_key);
87 bool is_valid_payment_id(
const std::string& payment_id);
88 bool is_valid_mnemonic(
const std::string& mnemonic,
const std::string& language =
"");
90 void validate_private_view_key(
const std::string& private_view_key);
91 void validate_private_spend_key(
const std::string& private_spend_key);
92 void validate_public_view_key(
const std::string& public_view_key);
93 void validate_public_spend_key(
const std::string& public_spend_key);
94 void validate_payment_id(
const std::string& payment_id);
95 void validate_mnemonic(
const std::string& mnemonic,
const std::string& language =
"");
96 void json_to_binary(
const std::string &json, std::string &bin);
97 void binary_to_json(
const std::string &bin, std::string &json);
98 void binary_blocks_to_json(
const std::string &bin, std::string &json);
99 void binary_blocks_fast_to_json(
const std::string &bin, std::string &json);
100 uint64_t xmr_to_atomic_units(
double amount_xmr);
101 double atomic_units_to_xmr(uint64_t amount_atomic_units);
111 void add_json_member(std::string key, T val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root, rapidjson::Value& field) {
112 rapidjson::Value field_key(key.c_str(), key.size(), allocator);
113 if (std::is_signed<T>::value) field.SetInt64((int64_t) val);
114 else field.SetUint64((uint64_t) val);
115 root.AddMember(field_key, field, allocator);
117 void add_json_member(std::string key, std::string val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root, rapidjson::Value& field);
118 void add_json_member(std::string key,
bool val, rapidjson::Document::AllocatorType& allocator, rapidjson::Value& root);
121 template <
class T> rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<std::shared_ptr<T>>& vals) {
122 rapidjson::Value value_arr(rapidjson::kArrayType);
123 for (
const auto& val : vals) {
124 value_arr.PushBack(val->to_rapidjson_val(allocator), allocator);
130 template <
class T> rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<T>& vals) {
131 rapidjson::Value value_arr(rapidjson::kArrayType);
132 for (
const auto& val : vals) {
133 value_arr.PushBack(val.to_rapidjson_val(allocator), allocator);
138 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<std::string>& strs);
139 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<int>& nums);
140 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<uint8_t>& nums);
141 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<uint32_t>& nums);
142 rapidjson::Value to_rapidjson_val(rapidjson::Document::AllocatorType& allocator,
const std::vector<uint64_t>& nums);
160 std::shared_ptr<monero_block>
cn_block_to_block(
const cryptonote::block& cn_block);
169 std::shared_ptr<monero_tx>
cn_tx_to_tx(
const cryptonote::transaction& cn_tx,
bool init_as_tx_wallet =
false);
176 static std::string get_pruned_tx_json(cryptonote::transaction &tx)
178 std::stringstream ss;
179 json_archive<true> ar(ss);
180 bool r = tx.serialize_base(ar);
181 CHECK_AND_ASSERT_MES(r, std::string(),
"Failed to serialize rct signatures base");
185 void binary_blocks_to_property_tree(
const std::string &bin, boost::property_tree::ptree &node);
186 void binary_blocks_fast_to_property_tree(
const std::string &bin, boost::property_tree::ptree &node);
195 void merge_tx(
const std::shared_ptr<monero_tx_wallet>& tx, std::map<std::string, std::shared_ptr<monero_tx_wallet>>& tx_map, std::map<uint64_t, std::shared_ptr<monero_block>>& block_map);
200 bool tx_height_less_than(
const std::shared_ptr<monero_tx>& tx1,
const std::shared_ptr<monero_tx>& tx2);
205 bool incoming_transfer_before(
const std::shared_ptr<monero_incoming_transfer>& transfer1,
const std::shared_ptr<monero_incoming_transfer>& transfer2);
210 bool vout_before(
const std::shared_ptr<monero_output>& o1,
const std::shared_ptr<monero_output>& o2);
214 static std::vector<std::shared_ptr<monero_block>> get_blocks_from_txs(std::vector<std::shared_ptr<monero_tx_wallet>> txs) {
215 std::shared_ptr<monero_block> unconfirmed_block =
nullptr;
216 std::vector<std::shared_ptr<monero_block>> blocks;
217 std::unordered_set<std::shared_ptr<monero_block>> seen_block_ptrs;
218 for (
const std::shared_ptr<monero_tx_wallet>& tx : txs) {
219 if (tx->m_block ==
nullptr) {
220 if (unconfirmed_block ==
nullptr) unconfirmed_block = std::make_shared<monero_block>();
221 tx->m_block = unconfirmed_block;
222 unconfirmed_block->m_txs.push_back(tx);
224 std::unordered_set<std::shared_ptr<monero_block>>::const_iterator got = seen_block_ptrs.find(tx->m_block);
225 if (got == seen_block_ptrs.end()) {
226 seen_block_ptrs.insert(tx->m_block);
227 blocks.push_back(tx->m_block);
233 static std::vector<std::shared_ptr<monero_block>> get_blocks_from_transfers(std::vector<std::shared_ptr<monero_transfer>> transfers) {
234 std::shared_ptr<monero_block> unconfirmed_block =
nullptr;
235 std::vector<std::shared_ptr<monero_block>> blocks;
236 std::unordered_set<std::shared_ptr<monero_block>> seen_block_ptrs;
237 for (
auto const& transfer : transfers) {
238 if (transfer->m_tx ==
nullptr)
throw std::runtime_error(
"Transfer has no tx");
239 std::shared_ptr<monero_tx_wallet> tx = transfer->m_tx;
240 if (tx->m_block ==
nullptr) {
241 if (unconfirmed_block ==
nullptr) unconfirmed_block = std::make_shared<monero_block>();
242 tx->m_block = unconfirmed_block;
243 unconfirmed_block->m_txs.push_back(tx);
245 std::unordered_set<std::shared_ptr<monero_block>>::const_iterator got = seen_block_ptrs.find(tx->m_block);
246 if (got == seen_block_ptrs.end()) {
247 seen_block_ptrs.insert(tx->m_block);
248 blocks.push_back(tx->m_block);
254 static std::vector<std::shared_ptr<monero_block>> get_blocks_from_outputs(std::vector<std::shared_ptr<monero_output_wallet>> outputs) {
255 std::vector<std::shared_ptr<monero_block>> blocks;
256 std::unordered_set<std::shared_ptr<monero_block>> seen_block_ptrs;
257 for (
auto const& output : outputs) {
258 if (output->m_tx ==
nullptr)
throw std::runtime_error(
"Output has no tx");
259 std::shared_ptr<monero_tx_wallet> tx = std::static_pointer_cast<monero_tx_wallet>(output->m_tx);
260 if (tx->m_block ==
nullptr)
throw std::runtime_error(
"Need to handle unconfirmed output");
261 std::unordered_set<std::shared_ptr<monero_block>>::const_iterator got = seen_block_ptrs.find(tx->m_block);
262 if (got == seen_block_ptrs.end()) {
263 seen_block_ptrs.insert(tx->m_block);
264 blocks.push_back(tx->m_block);
272 static void free(std::shared_ptr<monero_block> block) {
273 if (block ==
nullptr)
return;
274 for (std::shared_ptr<monero_tx>& tx : block->m_txs) {
276 monero_tx_wallet* tx_wallet =
dynamic_cast<monero_tx_wallet*
>(tx.get());
277 if (tx_wallet !=
nullptr) {
278 if (tx_wallet->m_tx_set !=
nullptr) tx_wallet->m_tx_set.reset();
279 if (tx_wallet->m_outgoing_transfer !=
nullptr) tx_wallet->m_outgoing_transfer->m_tx.reset();
280 for (std::shared_ptr<monero_transfer> transfer : tx_wallet->m_incoming_transfers) transfer->m_tx.reset();
281 for (std::shared_ptr<monero_output> output : tx_wallet->m_outputs) output->m_tx.reset();
282 for (std::shared_ptr<monero_output> input : tx_wallet->m_inputs) {
283 input->m_key_image.reset();
287 monero_tx_query* tx_query =
dynamic_cast<monero_tx_query*
>(tx.get());
288 if (tx_query !=
nullptr) {
289 if (tx_query->m_transfer_query !=
nullptr) {
290 tx_query->m_transfer_query->m_tx_query.reset();
291 tx_query->m_transfer_query.reset();
293 if (tx_query->m_output_query !=
nullptr) {
294 tx_query->m_output_query->m_tx_query.reset();
295 tx_query->m_output_query.reset();
302 static void free(std::vector<std::shared_ptr<monero_block>> blocks) {
303 for (std::shared_ptr<monero_block>& block : blocks) monero_utils::free(block);
306 static void free(std::shared_ptr<monero_tx> tx) {
307 if (tx ==
nullptr)
return;
308 if (tx->m_block ==
nullptr) {
309 std::shared_ptr<monero_block> block = std::make_shared<monero_block>();
311 block->m_txs.push_back(tx);
313 monero_utils::free(tx->m_block);
316 static void free(std::vector<std::shared_ptr<monero_tx_wallet>> txs) {
317 return monero_utils::free(monero_utils::get_blocks_from_txs(txs));
320 static void free(std::vector<std::shared_ptr<monero_transfer>> transfers) {
321 return monero_utils::free(monero_utils::get_blocks_from_transfers(transfers));
324 static void free(std::vector<std::shared_ptr<monero_output_wallet>> outputs) {
325 return monero_utils::free(monero_utils::get_blocks_from_outputs(outputs));