From b739dd6b51440905d3a6a6095c79d5ab3d40069a Mon Sep 17 00:00:00 2001 From: Czarek Nakamoto Date: Mon, 29 Apr 2024 14:09:14 +0200 Subject: [PATCH] multisig --- .../src/main/cpp/helpers.cpp | 13 +++++ .../src/main/cpp/helpers.hpp | 3 +- .../src/main/cpp/wallet2_api_c.cpp | 55 ++++++++++++++++++- .../src/main/cpp/wallet2_api_c.h | 7 +++ 4 files changed, 75 insertions(+), 3 deletions(-) diff --git a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp index 3f7c66a..d692879 100644 --- a/monero_libwallet2_api_c/src/main/cpp/helpers.cpp +++ b/monero_libwallet2_api_c/src/main/cpp/helpers.cpp @@ -169,6 +169,19 @@ std::set splitString(const std::string& str, const std::string& del return tokens; } +std::vector splitStringVector(const std::string& str, const std::string& delim) { + std::vector tokens; + if (str.empty()) return tokens; + size_t pos = 0; + std::string content = str; // Copy of str so we can safely erase content + while ((pos = content.find(delim)) != std::string::npos) { + tokens.push_back(content.substr(0, pos)); + content.erase(0, pos + delim.length()); + } + tokens.push_back(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; diff --git a/monero_libwallet2_api_c/src/main/cpp/helpers.hpp b/monero_libwallet2_api_c/src/main/cpp/helpers.hpp index 9513fc0..c3a64e6 100644 --- a/monero_libwallet2_api_c/src/main/cpp/helpers.hpp +++ b/monero_libwallet2_api_c/src/main/cpp/helpers.hpp @@ -9,4 +9,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::set& intSet, const std::string separator); 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 +std::vector splitStringUint(const std::string& str, const std::string& delim); +std::vector splitStringVector(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 d44c67c..8e12a25 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 @@ -1220,6 +1220,13 @@ void MONERO_Wallet_setSubaddressLabel(void* wallet_ptr, uint32_t accountIndex, u Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); return wallet->setSubaddressLabel(accountIndex, addressIndex, std::string(label)); } + +void* MONERO_Wallet_multisig(void* wallet_ptr) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + Monero::MultisigState *mstate_ptr = new Monero::MultisigState(wallet->multisig()); + return reinterpret_cast(mstate_ptr); +} + const char* MONERO_Wallet_getMultisigInfo(void* wallet_ptr) { Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); std::string str = wallet->getMultisigInfo(); @@ -1229,6 +1236,50 @@ const char* MONERO_Wallet_getMultisigInfo(void* wallet_ptr) { return buffer; } +const char* MONERO_Wallet_makeMultisig(void* wallet_ptr, const char* info, const char* info_separator, uint32_t threshold) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + std::string str = wallet->makeMultisig(splitStringVector(std::string(info), std::string(info_separator)), threshold); + const std::string::size_type size = str.size(); + char *buffer = new char[size + 1]; //we need extra char for NUL + memcpy(buffer, str.c_str(), size + 1); + return buffer; +} + +const char* MONERO_Wallet_exchangeMultisigKeys(void* wallet_ptr, const char* info, const char* info_separator, bool force_update_use_with_caution) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + std::string str = wallet->exchangeMultisigKeys(splitStringVector(std::string(info), std::string(info_separator)), force_update_use_with_caution); + const std::string::size_type size = str.size(); + char *buffer = new char[size + 1]; //we need extra char for NUL + memcpy(buffer, str.c_str(), size + 1); + return buffer; +} + +const char* MONERO_Wallet_exportMultisigImages(void* wallet_ptr, const char* separator) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + std::string str; + wallet->exportMultisigImages(str); + const std::string::size_type size = str.size(); + char *buffer = new char[size + 1]; //we need extra char for NUL + memcpy(buffer, str.c_str(), size + 1); + return buffer; +} + +size_t MONERO_Wallet_importMultisigImages(void* wallet_ptr, const char* info, const char* info_separator) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + return wallet->importMultisigImages(splitStringVector(std::string(info), std::string(info_separator))); +} + +size_t MONERO_Wallet_hasMultisigPartialKeyImages(void* wallet_ptr) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + return wallet->hasMultisigPartialKeyImages(); +} + +void* MONERO_Wallet_restoreMultisigTransaction(void* wallet_ptr, const char* signData) { + Monero::Wallet *wallet = reinterpret_cast(wallet_ptr); + return reinterpret_cast(wallet->restoreMultisigTransaction(std::string(signData))); +} + + Monero::PendingTransaction::Priority PendingTransaction_Priority_fromInt(int value) { switch(value) { case 0: return Monero::PendingTransaction::Priority::Priority_Default; @@ -1732,8 +1783,8 @@ uint64_t MONERO_DEBUG_test3(uint64_t x) { } void* MONERO_DEBUG_test4(uint64_t x) { - int y = x; - return reinterpret_cast(&y); + int *y = new int(x); + return reinterpret_cast(y); } const char* MONERO_DEBUG_test5() { 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 9f58778..0bc5003 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 @@ -678,14 +678,21 @@ extern ADDAPI const char* MONERO_Wallet_getSubaddressLabel(void* wallet_ptr, uin // virtual void setSubaddressLabel(uint32_t accountIndex, uint32_t addressIndex, const std::string &label) = 0; extern ADDAPI void MONERO_Wallet_setSubaddressLabel(void* wallet_ptr, uint32_t accountIndex, uint32_t addressIndex, const char* label); // virtual MultisigState multisig() const = 0; +extern ADDAPI void* MONERO_Wallet_multisig(void* wallet_ptr); // virtual std::string getMultisigInfo() const = 0; extern ADDAPI const char* MONERO_Wallet_getMultisigInfo(void* wallet_ptr); // virtual std::string makeMultisig(const std::vector& info, uint32_t threshold) = 0; +extern ADDAPI const char* MONERO_Wallet_makeMultisig(void* wallet_ptr, const char* info, const char* info_separator, uint32_t threshold); // virtual std::string exchangeMultisigKeys(const std::vector &info, const bool force_update_use_with_caution) = 0; +extern ADDAPI const char* MONERO_Wallet_exchangeMultisigKeys(void* wallet_ptr, const char* info, const char* info_separator, bool force_update_use_with_caution); // virtual bool exportMultisigImages(std::string& images) = 0; +extern ADDAPI const char* MONERO_Wallet_exportMultisigImages(void* wallet_ptr, const char* separator); // virtual size_t importMultisigImages(const std::vector& images) = 0; +extern ADDAPI size_t MONERO_Wallet_importMultisigImages(void* wallet_ptr, const char* info, const char* info_separator); // virtual bool hasMultisigPartialKeyImages() const = 0; +extern ADDAPI size_t MONERO_Wallet_hasMultisigPartialKeyImages(void* wallet_ptr); // virtual PendingTransaction* restoreMultisigTransaction(const std::string& signData) = 0; +extern ADDAPI void* MONERO_Wallet_restoreMultisigTransaction(void* wallet_ptr, const char* signData); // virtual PendingTransaction * createTransactionMultDest(const std::vector &dst_addr, const std::string &payment_id, // optional> amount, uint32_t mixin_count, // PendingTransaction::Priority = PendingTransaction::Priority_Low,