From 1ab7b730ab73bb6d61f544778ad736ac6883cc93 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 15 Feb 2026 11:57:54 +0100 Subject: [PATCH] Add known addresses functionality --- CMakeLists.txt | 1 + src/i_logos_blockchain_module.h | 10 ++---- src/known_addresses.h | 60 +++++++++++++++++++++++++++++++++ src/logos_blockchain_module.cpp | 16 +++++++++ src/logos_blockchain_module.h | 1 + 5 files changed, 80 insertions(+), 8 deletions(-) create mode 100644 src/known_addresses.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 78c5401..061f666 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,6 +160,7 @@ target_sources(${PLUGIN_TARGET} PRIVATE set_property(TARGET ${PLUGIN_TARGET} PROPERTY PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/src/i_logos_blockchain_module.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/known_addresses.h ) target_include_directories(${PLUGIN_TARGET} PRIVATE diff --git a/src/i_logos_blockchain_module.h b/src/i_logos_blockchain_module.h index 747e744..0dd744f 100644 --- a/src/i_logos_blockchain_module.h +++ b/src/i_logos_blockchain_module.h @@ -2,14 +2,7 @@ #define I_LOGOS_BLOCKCHAIN_MODULE_API_H #include - -#ifdef __cplusplus -extern "C" { -#endif -#include -#ifdef __cplusplus -} -#endif +#include "known_addresses.h" class ILogosBlockchainModule { public: @@ -27,6 +20,7 @@ public: BalanceResult* output_balance ) = 0; virtual int wallet_transfer_funds(const TransferFundsArguments* transfer_funds_arguments, Hash* output_hash) = 0; + virtual int wallet_get_known_addresses(lb::KnownAddresses* output) = 0; }; #define ILogosBlockchainModule_iid "org.logos.ilogosblockchainmodule" diff --git a/src/known_addresses.h b/src/known_addresses.h new file mode 100644 index 0000000..fb50d99 --- /dev/null +++ b/src/known_addresses.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif +#include +#ifdef __cplusplus +} +#endif + +namespace lb { + +class KnownAddresses { +public: + KnownAddresses() : data_(nullptr) {} + + explicit KnownAddresses(::KnownAddresses addresses) + : data_(new ::KnownAddresses(addresses), [](::KnownAddresses* ptr) { + if (ptr) { + free_known_addresses(*ptr); + delete ptr; + } + }) {} + + size_t size() const { + return data_ ? data_->len : 0; + } + + bool empty() const { + return size() == 0; + } + + const uint8_t* at(size_t index) const { + if (!data_ || index >= data_->len) { + return nullptr; + } + return data_->addresses[index]; + } + + const uint8_t* operator[](size_t index) const { + return at(index); + } + + bool valid() const { + return data_ != nullptr; + } + + explicit operator bool() const { + return valid(); + } + +private: + std::shared_ptr<::KnownAddresses> data_; +}; + +} // namespace lb diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index 722f217..014798b 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -156,6 +156,22 @@ int LogosBlockchainModule::wallet_transfer_funds( return 0; } +int LogosBlockchainModule::wallet_get_known_addresses(lb::KnownAddresses* output) { + if (!node) { + qWarning() << "Could not execute the operation: The node is not running."; + return 1; + } + + auto [value, error] = get_known_addresses(node); + if (!is_ok(&error)) { + qCritical() << "Failed to get known addresses. Error:" << error; + return 1; + } + + *output = lb::KnownAddresses(value); + return 0; +} + void LogosBlockchainModule::emitEvent(const QString& eventName, const QVariantList& data) { if (!logosAPI) { qWarning() << "LogosBlockchainModule: LogosAPI not available, cannot emit" << eventName; diff --git a/src/logos_blockchain_module.h b/src/logos_blockchain_module.h index d743401..f0a0dc3 100644 --- a/src/logos_blockchain_module.h +++ b/src/logos_blockchain_module.h @@ -22,6 +22,7 @@ public: Q_INVOKABLE int stop() override; Q_INVOKABLE int wallet_get_balance(const uint8_t*, const HeaderId*, BalanceResult*) override; Q_INVOKABLE int wallet_transfer_funds(const TransferFundsArguments*, Hash*) override; + Q_INVOKABLE int wallet_get_known_addresses(lb::KnownAddresses*) override; signals: void eventResponse(const QString& eventName, const QVariantList& data);