From a1d03a28a7e7c10c6a51d3e1de3d6a1fcd24ce30 Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto Date: Wed, 17 Apr 2024 15:55:34 +0200 Subject: [PATCH] add multi dest tx support --- .../src/main/cpp/helpers.cpp | 15 +++++++++++ .../src/main/cpp/helpers.hpp | 3 ++- .../src/main/cpp/wallet2_api_c.cpp | 27 ++++++++++++++++++- .../src/main/cpp/wallet2_api_c.h | 5 ++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp index 04befc6..d77995b 100644 --- a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp +++ b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp @@ -157,4 +157,19 @@ std::set splitString(const std::string& str, const std::string& del } tokens.insert(content); // Inserting the last token return tokens; +} + +std::vector splitStringUint(const std::string& str, const std::string& delim) { + std::vector tokens; + if (str.empty()) return tokens; + size_t pos = 0; + std::string token; + std::string content = str; // Copy of str so we can safely erase content + while ((pos = content.find(delim)) != std::string::npos) { + token = content.substr(0, pos); + tokens.push_back(std::stoull(token)); // Convert string to uint64_t and push to vector + content.erase(0, pos + delim.length()); + } + tokens.push_back(std::stoull(content)); // Inserting the last token + return tokens; } \ No newline at end of file diff --git a/monero_libwallet2_api_c/src/main/cpp/helpers.hpp b/monero_libwallet2_api_c/src/main/cpp/helpers.hpp index 45fa624..9513fc0 100644 --- a/monero_libwallet2_api_c/src/main/cpp/helpers.hpp +++ b/monero_libwallet2_api_c/src/main/cpp/helpers.hpp @@ -8,4 +8,5 @@ const char* vectorToString(const std::vector& vec, const std::string s const char* vectorToString(const std::vector& vec, const std::string separator); const char* vectorToString(const std::vector>& vec, const std::string separator); const char* vectorToString(const std::set& intSet, const std::string separator); -std::set splitString(const std::string& str, const std::string& delim); \ No newline at end of file +std::set splitString(const std::string& str, const std::string& delim); +std::vector splitStringUint(const std::string& str, const std::string& delim); \ No newline at end of file diff --git a/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.cpp b/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.cpp index ab13e15..251a428 100644 --- a/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.cpp +++ b/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.cpp @@ -1228,6 +1228,32 @@ Monero::PendingTransaction::Priority PendingTransaction_Priority_fromInt(int val } } +void* MONERO_Wallet_createTransactionMultDest(void* wallet_ptr, const char* &dst_addr_list, const char* dst_addr_list_separator, const char* payment_id, + bool amount_sweep_all, const char* amount_list, const char* amount_list_separator, uint32_t mixin_count, + int pendingTransactionPriority, + uint32_t subaddr_account, + const char* preferredInputs, const char* preferredInputs_separator) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + std::set dst_addr_ = splitString(std::string(dst_addr_list), std::string(dst_addr_list_separator)); + std::vector dst_addr(dst_addr_.begin(), dst_addr_.end()); + + Monero::optional> optAmount; + if (!amount_sweep_all) { + optAmount = splitStringUint(std::string(amount_list), std::string(amount_list_separator));; + } + std::set subaddr_indices = {}; + std::set preferred_inputs = splitString(std::string(preferredInputs), std::string(preferredInputs_separator)); + + return wallet->createTransactionMultDest( + dst_addr, std::string(payment_id), + optAmount, mixin_count, + PendingTransaction_Priority_fromInt(pendingTransactionPriority), + subaddr_account, + subaddr_indices, + preferred_inputs + ); +} + void* MONERO_Wallet_createTransaction(void* wallet_ptr, const char* dst_addr, const char* payment_id, uint64_t amount, uint32_t mixin_count, int pendingTransactionPriority, @@ -1246,7 +1272,6 @@ void* MONERO_Wallet_createTransaction(void* wallet_ptr, const char* dst_addr, co subaddr_account, subaddr_indices, preferred_inputs); } - void* MONERO_Wallet_loadUnsignedTx(void* wallet_ptr, const char* fileName) { Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); return wallet->loadUnsignedTx(std::string(fileName)); diff --git a/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.h b/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.h index f0bd66e..4cd1daf 100644 --- a/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.h +++ b/monero_libwallet2_api_c/src/main/cpp/wallet2_api_c.h @@ -687,6 +687,11 @@ extern ADDAPI const char* MONERO_Wallet_getMultisigInfo(void* wallet_ptr); // PendingTransaction::Priority = PendingTransaction::Priority_Low, // uint32_t subaddr_account = 0, // std::set subaddr_indices = {}) = 0; +extern ADDAPI void* MONERO_Wallet_createTransactionMultDest(void* wallet_ptr, const char* &dst_addr_list, const char* dst_addr_list_separator, const char* payment_id, + bool amount_sweep_all, const char* amount_list, const char* amount_list_separator, uint32_t mixin_count, + int pendingTransactionPriority, + uint32_t subaddr_account, + const char* preferredInputs, const char* preferredInputs_separator); // virtual PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id, // optional amount, uint32_t mixin_count, // PendingTransaction::Priority = PendingTransaction::Priority_Low,