From 4e5703787ea3bc1af23c446e95940a804dfe4bf4 Mon Sep 17 00:00:00 2001 From: Daniel Sanchez Date: Mon, 16 Feb 2026 10:49:02 +0100 Subject: [PATCH] feat(wallet): Add known address functionality (#11) * Update flake * Add known addresses functionality --- CMakeLists.txt | 1 + flake.lock | 6 ++-- src/i_logos_blockchain_module.h | 10 ++---- src/known_addresses.h | 60 +++++++++++++++++++++++++++++++++ src/logos_blockchain_module.cpp | 16 +++++++++ src/logos_blockchain_module.h | 1 + 6 files changed, 83 insertions(+), 11 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/flake.lock b/flake.lock index d4ae78c..f244457 100644 --- a/flake.lock +++ b/flake.lock @@ -23,11 +23,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1770980612, - "narHash": "sha256-MFSBq7BBC+yI3rv2ZWy7CF2l111zCdjNVvpR0Cc8gbI=", + "lastModified": 1771148003, + "narHash": "sha256-GhA2aeadEN24IMFYXnmCJxtJOx9ctuA8kTF7EWDqtY4=", "owner": "logos-blockchain", "repo": "logos-blockchain", - "rev": "5457fa1fa8568157c8165fdeab766efc65eb6e38", + "rev": "4c3738609e9fd4847db4f918e473da3c69b3366f", "type": "github" }, "original": { 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);