From 7dec5d819f623892223c30e6ecd6bbb1da95dd18 Mon Sep 17 00:00:00 2001 From: Khushboo Mehta Date: Tue, 21 Apr 2026 18:29:45 +0200 Subject: [PATCH 1/2] feat: use recommended logos-module-builder to simplify core modules --- CMakeLists.txt | 210 +--- README.md | 45 +- flake.lock | 2018 ++++++++++++++++++++++++------- flake.nix | 183 +-- justfile | 10 +- metadata.json | 25 +- src/i_logos_blockchain_module.h | 2 +- src/logos_blockchain_module.cpp | 27 +- src/logos_blockchain_module.h | 2 +- 9 files changed, 1682 insertions(+), 840 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66b79dc..1f007a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,203 +1,23 @@ -cmake_minimum_required(VERSION 3.20) -project(logos-blockchain-module LANGUAGES CXX) +cmake_minimum_required(VERSION 3.14) +project(LogosBlockchainModulePlugin LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -# ---- Options ---- -set(LOGOS_CORE_ROOT "" CACHE PATH "Path to logos-core root directory.") -set(LOGOS_BLOCKCHAIN_ROOT "" CACHE PATH "Path to logos-blockchain source root.") -set(LOGOS_BLOCKCHAIN_LIB "" CACHE PATH "Path to prebuilt logos-blockchain lib.") -set(LOGOS_BLOCKCHAIN_INCLUDE "" CACHE PATH "Path to prebuilt logos-blockchain include.") - -set(HAS_LOGOS_CORE_ROOT FALSE) -set(HAS_LOGOS_BLOCKCHAIN_ROOT FALSE) -set(HAS_LOGOS_BLOCKCHAIN_LIB FALSE) -set(HAS_LOGOS_BLOCKCHAIN_INCLUDE FALSE) - -if (DEFINED LOGOS_CORE_ROOT AND NOT "${LOGOS_CORE_ROOT}" STREQUAL "") - set(HAS_LOGOS_CORE_ROOT TRUE) -endif() - -if (DEFINED LOGOS_BLOCKCHAIN_ROOT AND NOT "${LOGOS_BLOCKCHAIN_ROOT}" STREQUAL "") - set(HAS_LOGOS_BLOCKCHAIN_ROOT TRUE) -endif() - -if(DEFINED LOGOS_BLOCKCHAIN_LIB AND NOT "${LOGOS_BLOCKCHAIN_LIB}" STREQUAL "") - set(HAS_LOGOS_BLOCKCHAIN_LIB TRUE) -endif() - -if(DEFINED LOGOS_BLOCKCHAIN_INCLUDE AND NOT "${LOGOS_BLOCKCHAIN_INCLUDE}" STREQUAL "") - set(HAS_LOGOS_BLOCKCHAIN_INCLUDE TRUE) -endif() - -if (NOT HAS_LOGOS_CORE_ROOT) - message(FATAL_ERROR "LOGOS_CORE_ROOT must be set to the logos-core root directory.") -endif() - -if(HAS_LOGOS_BLOCKCHAIN_LIB AND HAS_LOGOS_BLOCKCHAIN_INCLUDE AND NOT HAS_LOGOS_BLOCKCHAIN_ROOT) - message(STATUS "Using prebuilt logos-blockchain.") - set(LOGOS_BLOCKCHAIN_PREBUILT TRUE) -elseif(NOT HAS_LOGOS_BLOCKCHAIN_LIB AND NOT HAS_LOGOS_BLOCKCHAIN_INCLUDE AND HAS_LOGOS_BLOCKCHAIN_ROOT) - message(STATUS "Building logos-blockchain from source.") - set(LOGOS_BLOCKCHAIN_PREBUILT FALSE) +if(DEFINED ENV{LOGOS_MODULE_BUILDER_ROOT}) + include($ENV{LOGOS_MODULE_BUILDER_ROOT}/cmake/LogosModule.cmake) else() - message(FATAL_ERROR "Either both LOGOS_BLOCKCHAIN_LIB and LOGOS_BLOCKCHAIN_INCLUDE must be set for prebuilt logos-blockchain, or only LOGOS_BLOCKCHAIN_ROOT must be set for building from source.") + message(FATAL_ERROR "LogosModule.cmake not found. Set LOGOS_MODULE_BUILDER_ROOT.") endif() -# ---- Qt ---- -find_package(Qt6 REQUIRED COMPONENTS Core RemoteObjects) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTOUIC ON) -set(CMAKE_AUTORCC ON) - -# ---- Directories ---- -set(WORKSPACE_ROOT "${CMAKE_BINARY_DIR}/workspace") -file(MAKE_DIRECTORY "${WORKSPACE_ROOT}") - -# ---- Logos Core SDK ---- -set(SDK_LIB "${LOGOS_CORE_ROOT}/lib/liblogos_sdk.a") -set(SDK_INC "${LOGOS_CORE_ROOT}/include") - -# ---- OS Specifics ---- -if(APPLE) - set(DYLIB_EXT ".dylib") -elseif(WIN32) - set(DYLIB_EXT ".dll") - set(IMPLIB_EXT ".lib") -else() - set(DYLIB_EXT ".so") -endif() - -# NOTE (Windows): -# Rust cdylib typically produces: -# - logos_blockchain.dll (runtime) -# - logos_blockchain.lib (import lib) -# The Windows build hasn't been yet, so adjust accordingly if the DLL is named without the 'lib' prefix. - -# ---- Logos Blockchain (build OR consume) ---- -if(LOGOS_BLOCKCHAIN_PREBUILT) - set(LOGOS_BLOCKCHAIN_DYLIB "${LOGOS_BLOCKCHAIN_LIB}/liblogos_blockchain${DYLIB_EXT}") - - if(WIN32) - set(LOGOS_BLOCKCHAIN_IMPLIB "${LOGOS_BLOCKCHAIN_LIB}/logos_blockchain${IMPLIB_EXT}") - endif() - - add_custom_target(logos_blockchain_libs) - -else() - find_program(CARGO_EXECUTABLE cargo REQUIRED) - - set(CARGO_TARGET_DIR "${WORKSPACE_ROOT}/logos-blockchain/target") - set(INTERNAL_STAGE "${WORKSPACE_ROOT}/stage") - set(INTERNAL_STAGE_LIB "${INTERNAL_STAGE}/lib") - set(INTERNAL_STAGE_INCLUDE "${INTERNAL_STAGE}/include") - file(MAKE_DIRECTORY "${CARGO_TARGET_DIR}" "${INTERNAL_STAGE_LIB}" "${INTERNAL_STAGE_INCLUDE}") - - set(LOGOS_BLOCKCHAIN_LIB "${INTERNAL_STAGE_LIB}") - set(LOGOS_BLOCKCHAIN_INCLUDE "${INTERNAL_STAGE_INCLUDE}") - - set(LOGOS_BLOCKCHAIN_DYLIB "${INTERNAL_STAGE_LIB}/liblogos_blockchain${DYLIB_EXT}") - set(LOGOS_BLOCKCHAIN_HEADER "${INTERNAL_STAGE_INCLUDE}/logos_blockchain.h") - - add_custom_command( - OUTPUT "${LOGOS_BLOCKCHAIN_DYLIB}" - COMMAND ${CMAKE_COMMAND} -E env - CARGO_TARGET_DIR=${CARGO_TARGET_DIR} - ${CARGO_EXECUTABLE} build --release - --package logos-blockchain-c - --manifest-path "${LOGOS_BLOCKCHAIN_ROOT}/Cargo.toml" - COMMAND ${CMAKE_COMMAND} -E copy - "${CARGO_TARGET_DIR}/release/liblogos_blockchain${DYLIB_EXT}" - "${LOGOS_BLOCKCHAIN_DYLIB}" - DEPENDS "${LOGOS_BLOCKCHAIN_ROOT}/Cargo.toml" - VERBATIM - ) - - add_custom_command( - OUTPUT "${LOGOS_BLOCKCHAIN_HEADER}" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${LOGOS_BLOCKCHAIN_ROOT}/c-bindings/logos_blockchain.h" - "${LOGOS_BLOCKCHAIN_HEADER}" - DEPENDS "${LOGOS_BLOCKCHAIN_DYLIB}" - VERBATIM - ) - - add_custom_target(logos_blockchain_libs DEPENDS "${LOGOS_BLOCKCHAIN_DYLIB}" "${LOGOS_BLOCKCHAIN_HEADER}") -endif() - -# ---- Imported targets ---- -add_library(logos_blockchain_interface SHARED IMPORTED GLOBAL) -set_target_properties(logos_blockchain_interface PROPERTIES - IMPORTED_LOCATION "${LOGOS_BLOCKCHAIN_DYLIB}" - INTERFACE_INCLUDE_DIRECTORIES "${LOGOS_BLOCKCHAIN_INCLUDE}" +# logos_module() handles: Qt/AUTOMOC setup, SDK/module include paths, linking +# libs from EXTERNAL_LIBS into lib/, plugin output naming, RPATH, install rules. +logos_module( + NAME liblogos_blockchain_module + SOURCES + src/i_logos_blockchain_module.h + src/logos_blockchain_module.h + src/logos_blockchain_module.cpp + EXTERNAL_LIBS + logos_blockchain ) - -if(NOT LOGOS_BLOCKCHAIN_PREBUILT) - add_dependencies(logos_blockchain_interface logos_blockchain_libs) -endif() - -if(WIN32) - set_target_properties(logos_blockchain_interface PROPERTIES IMPORTED_IMPLIB "${LOGOS_BLOCKCHAIN_IMPLIB}") -endif() - -add_library(logos_core STATIC IMPORTED) -set_target_properties(logos_core PROPERTIES - IMPORTED_LOCATION "${SDK_LIB}" -) - -add_library(logos_cpp_sdk INTERFACE) -target_include_directories(logos_cpp_sdk INTERFACE "${SDK_INC}" "${SDK_INC}/cpp") - -# ---- Plugin ---- -set(PLUGIN_TARGET logos_blockchain_module) - -qt_add_plugin(${PLUGIN_TARGET} CLASS_NAME LogosBlockchainModule) - -target_sources(${PLUGIN_TARGET} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src/logos_blockchain_module.cpp -) - -set_property(TARGET ${PLUGIN_TARGET} PROPERTY PUBLIC_HEADER - ${CMAKE_CURRENT_SOURCE_DIR}/src/i_logos_blockchain_module.h -) - -target_include_directories(${PLUGIN_TARGET} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src -) - -target_link_libraries(${PLUGIN_TARGET} PRIVATE - Qt6::Core - Qt6::RemoteObjects - logos_blockchain_interface - logos_cpp_sdk - logos_core -) - -target_compile_definitions(${PLUGIN_TARGET} PRIVATE - LOGOS_BLOCKCHAIN_MODULE_METADATA_FILE="${CMAKE_CURRENT_SOURCE_DIR}/metadata.json" -) - -add_dependencies(${PLUGIN_TARGET} logos_blockchain_libs) - -if(APPLE) - set_target_properties(${PLUGIN_TARGET} PROPERTIES - BUILD_RPATH "@loader_path" - INSTALL_RPATH "@loader_path" - ) -elseif(UNIX) - set_target_properties(${PLUGIN_TARGET} PROPERTIES - BUILD_RPATH "$ORIGIN" - INSTALL_RPATH "$ORIGIN" - ) -endif() - -# ---- Install ---- -install(TARGETS ${PLUGIN_TARGET} - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - PUBLIC_HEADER DESTINATION include -) -install(DIRECTORY "${LOGOS_BLOCKCHAIN_INCLUDE}/" DESTINATION include) -install(FILES "${LOGOS_BLOCKCHAIN_DYLIB}" DESTINATION lib) diff --git a/README.md b/README.md index c758682..aceea33 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,41 @@ # Logos Blockchain Module -### Setup +A Logos core module that wraps the [logos-blockchain](https://github.com/logos-blockchain/logos-blockchain) C bindings and ships the zk circuit binaries needed at runtime. -#### IDE +Built with [logos-module-builder](https://github.com/logos-co/logos-module-builder): `flake.nix`, `CMakeLists.txt`, and `metadata.json` are the only build-system files. The module-builder's `mkLogosModule` pulls the prebuilt `logos-blockchain-c` derivation (lib + header) in via `externalLibInputs`; the circuits directory is staged separately in `preConfigure` / `postInstall` because it's runtime data rather than a library. -If you're using an IDE with CMake integration make sure it points to the same cmake directory as the `justfile`, which defaults to `build`. +### Build and inspect -This will reduce friction when working on the project. +```bash +# In the workspace (preferred): +ws build logos-blockchain-module +ws build logos-blockchain-module --auto-local # pick up local dep overrides -#### Nix +# Inspect the built plugin +lm ./result/lib/liblogos_blockchain_module_plugin.so -* Use `nix flake update` to bring all nix context and packages -* Use `nix build` to build the package -* Use `nix run` to launch the module-viewer and check your module loads properly -* Use `nix develop` to setup your IDE +# Standalone +nix build # -> result/lib/.so + result/lib/circuits/ +nix develop # cmake/ninja iteration +``` + +### Files + +- `flake.nix` — `mkLogosModule` call + circuits staging +- `CMakeLists.txt` — single `logos_module()` macro + C++20 bump +- `metadata.json` — module identity, deps, and `nix.external_libraries` +- `src/` — plugin sources (Q_OBJECT + Q_INVOKABLE API) ### Troubleshooting #### Nix + IDE Integration -If your IDE reports that a file doesn't belong to the project or that files cannot be found, the CMake cache -is likely missing the Nix-provided paths. This happens when the IDE runs CMake on its own, outside the Nix -environment, leaving the required paths empty. +If your IDE reports that a file doesn't belong to the project or that files cannot be found, the CMake cache is likely missing the Nix-provided paths. This happens when the IDE runs CMake on its own, outside the Nix environment, leaving `LOGOS_CPP_SDK_ROOT` / `LOGOS_MODULE_BUILDER_ROOT` unset. To fix it: -1. **Regenerate the cache from within the Nix shell** - - This provides the required Nix paths and writes them into `build/CMakeCache.txt`: +1. **Regenerate the cache from within the Nix shell** — this provides the required Nix paths and writes them into `build/CMakeCache.txt`: ```bash - nix develop -c just configure + nix develop -c cmake -B build -GNinja ``` -2. **Reload the CMake project without resetting the cache** - - If on RustRover: Open the CMake tool window (**View → Tool Windows → CMake**) and click the **Reload** button (↺) in the toolbar. - -> Resetting the cache would wipe the paths you just wrote, so make sure to reload only. +2. **Reload the CMake project without resetting the cache.** On RustRover: open the CMake tool window (**View → Tool Windows → CMake**) and click **Reload** (↺). Resetting the cache would wipe the paths you just wrote. diff --git a/flake.lock b/flake.lock index 1d24120..aeb03f8 100644 --- a/flake.lock +++ b/flake.lock @@ -57,12 +57,16 @@ }, "logos-capability-module": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk", - "logos-module": "logos-module", - "logos-nix": "logos-nix_4", + "logos-cpp-sdk": [ + "logos-module-builder", + "logos-standalone-app", + "logos-cpp-sdk" + ], + "logos-module": "logos-module_4", + "logos-nix": "logos-nix_9", "nixpkgs": [ - "logos-liblogos", - "logos-capability-module", + "logos-module-builder", + "logos-standalone-app", "logos-nix", "nixpkgs" ] @@ -84,69 +88,47 @@ "logos-capability-module_2": { "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_3", - "logos-liblogos": "logos-liblogos_2", + "logos-module": "logos-module_5", + "logos-nix": "logos-nix_14", "nixpkgs": [ - "logos-module-viewer", - "logos-capability-module", - "logos-liblogos", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1767809111, - "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", - "owner": "logos-co", - "repo": "logos-capability-module", - "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-capability-module", - "type": "github" - } - }, - "logos-capability-module_3": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_6", - "logos-liblogos": "logos-liblogos_4", - "nixpkgs": [ - "logos-module-viewer", + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-capability-module", - "logos-liblogos", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1773696504, - "narHash": "sha256-wBn8onAkEvtvl1McLVyFDSB8BRhUrwJAnnYIfXnIhdI=", - "owner": "logos-co", - "repo": "logos-capability-module", - "rev": "2ee07fea9d0b9aca89dc215ee8b3be222017d706", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-capability-module", - "type": "github" - } - }, - "logos-core": { - "inputs": { - "logos-nix": "logos-nix", - "nixpkgs": [ - "logos-core", "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1776882680, - "narHash": "sha256-g1E1L7Ac7PHUFuay/RDQDY2GZPy9lJotDG1MI15bOQ4=", + "lastModified": 1774455138, + "narHash": "sha256-szx2dnnY9MP1NpdBnR8E2DRSz9CtQlo/6698zgJcAEM=", + "owner": "logos-co", + "repo": "logos-capability-module", + "rev": "0655be68e0078bede0682bb6a5b53330dac37a72", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-capability-module", + "type": "github" + } + }, + "logos-cpp-sdk": { + "inputs": { + "logos-nix": "logos-nix", + "nixpkgs": [ + "logos-module-builder", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1776778717, + "narHash": "sha256-HTtNO9I++CSwd64T0jpsPn+mixeZnebFxHKE4840mPY=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "ecd369d48bffda2ad3c5233687603ef07d8b76a6", + "rev": "f7c855b110e493c293e81f473757cf17ee772514", "type": "github" }, "original": { @@ -155,10 +137,37 @@ "type": "github" } }, - "logos-cpp-sdk": { + "logos-cpp-sdk_2": { "inputs": { - "logos-nix": "logos-nix_2", + "logos-nix": "logos-nix_10", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_3": { + "inputs": { + "logos-nix": "logos-nix_12", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-capability-module", "logos-cpp-sdk", @@ -180,46 +189,12 @@ "type": "github" } }, - "logos-cpp-sdk_10": { + "logos-cpp-sdk_4": { "inputs": { - "nixpkgs": "nixpkgs_25" - }, - "locked": { - "lastModified": 1767724329, - "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_11": { - "inputs": { - "nixpkgs": "nixpkgs_26" - }, - "locked": { - "lastModified": 1764699992, - "narHash": "sha256-nCmK9C9F31cHvy6lWKR5WGl99aJbS3kIsROAoZ4OrwI=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "5d0bbd0d1e00aad0532ffa7c8bf2c80f460a4f6d", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_2": { - "inputs": { - "logos-nix": "logos-nix_5", + "logos-nix": "logos-nix_15", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-cpp-sdk", "logos-nix", @@ -227,11 +202,11 @@ ] }, "locked": { - "lastModified": 1776359718, - "narHash": "sha256-G2+MbYPictF9V9864KndteaEJzd8iUMktSzCphETabw=", + "lastModified": 1775745471, + "narHash": "sha256-Flz0Ipok57ivbqg7Fw4qRcfCL3ainrRTXMIlNDh3ajY=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "04b75c84b821662c9ae8f69967d4dd508e6d9e17", + "rev": "8b1cfadf090f0df9d75e61ac7475d83f9c58b0a9", "type": "github" }, "original": { @@ -240,256 +215,52 @@ "type": "github" } }, - "logos-cpp-sdk_3": { + "logos-design-system": { "inputs": { - "nixpkgs": "nixpkgs_16" + "logos-nix": "logos-nix_11", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-design-system", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1761230734, - "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "lastModified": 1777999983, + "narHash": "sha256-D6W7oC80cT7pg95kSpxO0jtoVj1hG9A151CciCSZaBc=", "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "repo": "logos-design-system", + "rev": "f6e95ae24ede3871c380f8250feffd17d173f5a4", "type": "github" }, "original": { "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_4": { - "inputs": { - "nixpkgs": "nixpkgs_17" - }, - "locked": { - "lastModified": 1761230734, - "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "4b143922c190df00bb3835441c9f0075cb28283b", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_5": { - "inputs": { - "nixpkgs": "nixpkgs_18" - }, - "locked": { - "lastModified": 1773672219, - "narHash": "sha256-p+kv2WHokT40rScnSFSIDp/EeFLaDUsTHW6QT6ejKuc=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "a4bd66cd6eb04ee7140bb940b1d49d72d60248de", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_6": { - "inputs": { - "nixpkgs": "nixpkgs_19" - }, - "locked": { - "lastModified": 1773672219, - "narHash": "sha256-p+kv2WHokT40rScnSFSIDp/EeFLaDUsTHW6QT6ejKuc=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "a4bd66cd6eb04ee7140bb940b1d49d72d60248de", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_7": { - "inputs": { - "nixpkgs": "nixpkgs_20" - }, - "locked": { - "lastModified": 1761230734, - "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "4b143922c190df00bb3835441c9f0075cb28283b", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_8": { - "inputs": { - "nixpkgs": "nixpkgs_21" - }, - "locked": { - "lastModified": 1773672219, - "narHash": "sha256-p+kv2WHokT40rScnSFSIDp/EeFLaDUsTHW6QT6ejKuc=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "a4bd66cd6eb04ee7140bb940b1d49d72d60248de", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_9": { - "inputs": { - "nixpkgs": "nixpkgs_22" - }, - "locked": { - "lastModified": 1767724329, - "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", + "repo": "logos-design-system", "type": "github" } }, "logos-liblogos": { "inputs": { - "logos-capability-module": "logos-capability-module", - "logos-cpp-sdk": "logos-cpp-sdk_2", - "logos-module": "logos-module_2", - "logos-nix": "logos-nix_7", + "logos-capability-module": "logos-capability-module_2", + "logos-cpp-sdk": "logos-cpp-sdk_4", + "logos-module": "logos-module_6", + "logos-nix": "logos-nix_17", "logos-package-manager": "logos-package-manager", "nixpkgs": [ - "logos-liblogos", + "logos-module-builder", + "logos-standalone-app", "logos-nix", "nixpkgs" ], "process-stats": "process-stats" }, "locked": { - "lastModified": 1776950445, - "narHash": "sha256-UQBZehyqd4GcqBLp4Uiu8r6bl/SJbpfmO/S5Z9luBeQ=", + "lastModified": 1776084938, + "narHash": "sha256-0UL6tG6mK00HN99fm9CLJu3JA9ay2ry6dgeHfyApiWo=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "b82145ce9a8907624b8593ac85897d54f33b3bc4", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-liblogos", - "type": "github" - } - }, - "logos-liblogos_2": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_4", - "nixpkgs": [ - "logos-module-viewer", - "logos-capability-module", - "logos-liblogos", - "logos-cpp-sdk", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1761845775, - "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", - "owner": "logos-co", - "repo": "logos-liblogos", - "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-liblogos", - "type": "github" - } - }, - "logos-liblogos_3": { - "inputs": { - "logos-capability-module": "logos-capability-module_3", - "logos-cpp-sdk": "logos-cpp-sdk_8", - "logos-module": "logos-module_3", - "nix-bundle-appimage": "nix-bundle-appimage_2", - "nix-bundle-dir": "nix-bundle-dir_4", - "nixpkgs": [ - "logos-module-viewer", - "logos-liblogos", - "logos-cpp-sdk", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1773696645, - "narHash": "sha256-GIb4xALCj3XK80rf6l89ZrZ/Y1YkqG1X/mfmVOUl/hw=", - "owner": "logos-co", - "repo": "logos-liblogos", - "rev": "5030aaaf86b89a382f3beb9426be4f8c2623215f", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-liblogos", - "type": "github" - } - }, - "logos-liblogos_4": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_7", - "nixpkgs": [ - "logos-module-viewer", - "logos-liblogos", - "logos-capability-module", - "logos-liblogos", - "logos-cpp-sdk", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1761845775, - "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", - "owner": "logos-co", - "repo": "logos-liblogos", - "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-liblogos", - "type": "github" - } - }, - "logos-liblogos_5": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_11", - "nixpkgs": [ - "logos-module-viewer", - "logos-package-manager", - "logos-liblogos", - "logos-cpp-sdk", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1768343028, - "narHash": "sha256-4LvsuZTDTlLtfMF4C69ls+lmkYJWD7LZitS04Mc+8UI=", - "owner": "logos-co", - "repo": "logos-liblogos", - "rev": "a76d33f5519af0ee12317c8f149eee2ac5d292a0", + "rev": "b293e9d70a04983778ef2ef3ef42596f76f41161", "type": "github" }, "original": { @@ -500,8 +271,141 @@ }, "logos-module": { "inputs": { - "logos-nix": "logos-nix_3", + "logos-nix": "logos-nix_2", "nixpkgs": [ + "logos-module-builder", + "logos-module", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775763932, + "narHash": "sha256-PrVdkHNN2PPXoUEJoJUKv61t6IeQ3iQSRarIpFr9GHE=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "73cd9c4b2646dedb1b624a3178b32a7af1670047", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-module-builder": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk", + "logos-module": "logos-module", + "logos-nix": "logos-nix_3", + "logos-plugin-core": "logos-plugin-core", + "logos-plugin-qt": "logos-plugin-qt", + "logos-standalone-app": "logos-standalone-app", + "logos-test-framework": "logos-test-framework", + "nix-bundle-lgx": "nix-bundle-lgx_2", + "nix-bundle-logos-module-install": "nix-bundle-logos-module-install", + "nixpkgs": [ + "logos-module-builder", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778000574, + "narHash": "sha256-6jN8NVUJNYr5Si+6hOW54aBsLKEOnbE0uZOgy+wm5FU=", + "owner": "logos-co", + "repo": "logos-module-builder", + "rev": "eee512c9b56b3fb35938b23f21c81fca07993434", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module-builder", + "type": "github" + } + }, + "logos-module_2": { + "inputs": { + "logos-nix": "logos-nix_4", + "nixpkgs": [ + "logos-module-builder", + "logos-plugin-core", + "logos-module", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774988698, + "narHash": "sha256-Ugngv17u5CA3lOSNHN6nJ+/WpIyNn8yui0M2VDdkENk=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "337223f2a72710d8052ca750510cd25d33e05047", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-module_3": { + "inputs": { + "logos-nix": "logos-nix_6", + "nixpkgs": [ + "logos-module-builder", + "logos-plugin-qt", + "logos-module", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774988698, + "narHash": "sha256-Ugngv17u5CA3lOSNHN6nJ+/WpIyNn8yui0M2VDdkENk=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "337223f2a72710d8052ca750510cd25d33e05047", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-module_4": { + "inputs": { + "logos-nix": "logos-nix_8", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-capability-module", + "logos-module", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773963329, + "narHash": "sha256-zdvDHoYWQDse0eJ/UCKIJcfuYJ8NMgl6QfxRcyDEovI=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "ac5a4f06ea94b01dd9c5fbb9ed4f20620beab88d", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-module_5": { + "inputs": { + "logos-nix": "logos-nix_13", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-capability-module", "logos-module", @@ -523,36 +427,12 @@ "type": "github" } }, - "logos-module-viewer": { + "logos-module_6": { "inputs": { - "logos-capability-module": "logos-capability-module_2", - "logos-cpp-sdk": "logos-cpp-sdk_5", - "logos-liblogos": "logos-liblogos_3", - "logos-package-manager": "logos-package-manager_2", - "nixpkgs": [ - "logos-module-viewer", - "logos-liblogos", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1774455291, - "narHash": "sha256-4O07OAO+5Pqcfdjdk4amYwx27Di3eKRg9y/NiDy3+b4=", - "owner": "logos-co", - "repo": "logos-module-viewer", - "rev": "b6489c1aab8c1590fa127dbaedb39708f3614fbc", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-module-viewer", - "type": "github" - } - }, - "logos-module_2": { - "inputs": { - "logos-nix": "logos-nix_6", + "logos-nix": "logos-nix_16", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-module", "logos-nix", @@ -560,36 +440,11 @@ ] }, "locked": { - "lastModified": 1776369033, - "narHash": "sha256-ehePoUEd/u3Ng0TvCmjocXYJWWH6P61PA7tNpgV59lo=", + "lastModified": 1775763932, + "narHash": "sha256-PrVdkHNN2PPXoUEJoJUKv61t6IeQ3iQSRarIpFr9GHE=", "owner": "logos-co", "repo": "logos-module", - "rev": "194778491ef4dd36967ac40cc2fec6b8a8b1d660", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-module", - "type": "github" - } - }, - "logos-module_3": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_9", - "nixpkgs": [ - "logos-module-viewer", - "logos-liblogos", - "logos-module", - "logos-cpp-sdk", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1770999556, - "narHash": "sha256-anpsEniGTTwUAwknRxjaT9GP4avHzIsolEHdHDTV9rM=", - "owner": "logos-co", - "repo": "logos-module", - "rev": "d1b35f335f938bb5de21a2a6010f1104075bdb1c", + "rev": "73cd9c4b2646dedb1b624a3178b32a7af1670047", "type": "github" }, "original": { @@ -688,6 +543,114 @@ "type": "github" } }, + "logos-nix_14": { + "inputs": { + "nixpkgs": "nixpkgs_16" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_15": { + "inputs": { + "nixpkgs": "nixpkgs_17" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_16": { + "inputs": { + "nixpkgs": "nixpkgs_18" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_17": { + "inputs": { + "nixpkgs": "nixpkgs_19" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_18": { + "inputs": { + "nixpkgs": "nixpkgs_20" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_19": { + "inputs": { + "nixpkgs": "nixpkgs_21" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, "logos-nix_2": { "inputs": { "nixpkgs": "nixpkgs_4" @@ -706,10 +669,370 @@ "type": "github" } }, + "logos-nix_20": { + "inputs": { + "nixpkgs": "nixpkgs_22" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_21": { + "inputs": { + "nixpkgs": "nixpkgs_23" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_22": { + "inputs": { + "nixpkgs": "nixpkgs_24" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_23": { + "inputs": { + "nixpkgs": "nixpkgs_25" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_24": { + "inputs": { + "nixpkgs": "nixpkgs_26" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_25": { + "inputs": { + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_26": { + "inputs": { + "nixpkgs": "nixpkgs_28" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_27": { + "inputs": { + "nixpkgs": "nixpkgs_29" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_28": { + "inputs": { + "nixpkgs": "nixpkgs_30" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_29": { + "inputs": { + "nixpkgs": "nixpkgs_31" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, "logos-nix_3": { "inputs": { "nixpkgs": "nixpkgs_5" }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_30": { + "inputs": { + "nixpkgs": "nixpkgs_32" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_31": { + "inputs": { + "nixpkgs": "nixpkgs_33" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_32": { + "inputs": { + "nixpkgs": "nixpkgs_34" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_33": { + "inputs": { + "nixpkgs": "nixpkgs_35" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_34": { + "inputs": { + "nixpkgs": "nixpkgs_36" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_35": { + "inputs": { + "nixpkgs": "nixpkgs_37" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_36": { + "inputs": { + "nixpkgs": "nixpkgs_38" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_37": { + "inputs": { + "nixpkgs": "nixpkgs_39" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_38": { + "inputs": { + "nixpkgs": "nixpkgs_40" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_39": { + "inputs": { + "nixpkgs": "nixpkgs_41" + }, "locked": { "lastModified": 1773955630, "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", @@ -742,9 +1065,27 @@ "type": "github" } }, - "logos-nix_5": { + "logos-nix_40": { "inputs": { - "nixpkgs": "nixpkgs_7" + "nixpkgs": "nixpkgs_42" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_41": { + "inputs": { + "nixpkgs": "nixpkgs_43" }, "locked": { "lastModified": 1773955630, @@ -760,6 +1101,42 @@ "type": "github" } }, + "logos-nix_42": { + "inputs": { + "nixpkgs": "nixpkgs_44" + }, + "locked": { + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, + "logos-nix_5": { + "inputs": { + "nixpkgs": "nixpkgs_7" + }, + "locked": { + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "owner": "logos-co", + "repo": "logos-nix", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-nix", + "type": "github" + } + }, "logos-nix_6": { "inputs": { "nixpkgs": "nixpkgs_8" @@ -801,11 +1178,11 @@ "nixpkgs": "nixpkgs_10" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -834,8 +1211,10 @@ }, "logos-package": { "inputs": { - "logos-nix": "logos-nix_9", + "logos-nix": "logos-nix_19", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-package-manager", "logos-package", @@ -843,6 +1222,140 @@ "nixpkgs" ] }, + "locked": { + "lastModified": 1775677349, + "narHash": "sha256-G+0E1mkmG3QDeTR4Pgy+xkiole/TDq+FYrvHwNp9Yrc=", + "owner": "logos-co", + "repo": "logos-package", + "rev": "64edea0e64309e1c9f91259d16f8f81e5e39e40e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package", + "type": "github" + } + }, + "logos-package-manager": { + "inputs": { + "logos-nix": "logos-nix_18", + "logos-package": "logos-package", + "nix-bundle-appimage": "nix-bundle-appimage", + "nix-bundle-dir": "nix-bundle-dir_2", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "logos-package-manager", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775680583, + "narHash": "sha256-0Bh48zTfi4lPL78ZLgmiX+QMW+nvjWKXHp5iJPEhvLg=", + "owner": "logos-co", + "repo": "logos-package-manager", + "rev": "8110734252edf9ca4266f475ace1c7c9bee68018", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package-manager", + "type": "github" + } + }, + "logos-package-manager_2": { + "inputs": { + "logos-nix": "logos-nix_35", + "logos-package": "logos-package_4", + "nix-bundle-appimage": "nix-bundle-appimage_2", + "nix-bundle-dir": "nix-bundle-dir_6", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-package-manager", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775836847, + "narHash": "sha256-pU7GShEizE8HkDGvR9NWZPqksiGyvfcWodtFyc318TM=", + "owner": "logos-co", + "repo": "logos-package-manager", + "rev": "39118d6c52226e88a77c6ff7d1196229f56b757e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package-manager", + "type": "github" + } + }, + "logos-package_2": { + "inputs": { + "logos-nix": "logos-nix_28", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "nix-bundle-lgx", + "logos-package", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775835037, + "narHash": "sha256-Cti0DhkzyLQs98BSzcHWMLtGXpa3n+R+5upfSw6vKdQ=", + "owner": "logos-co", + "repo": "logos-package", + "rev": "ff93a0df15ceab255f27687d22d962ea2737efbe", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package", + "type": "github" + } + }, + "logos-package_3": { + "inputs": { + "logos-nix": "logos-nix_32", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-lgx", + "logos-package", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775835037, + "narHash": "sha256-Cti0DhkzyLQs98BSzcHWMLtGXpa3n+R+5upfSw6vKdQ=", + "owner": "logos-co", + "repo": "logos-package", + "rev": "ff93a0df15ceab255f27687d22d962ea2737efbe", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package", + "type": "github" + } + }, + "logos-package_4": { + "inputs": { + "logos-nix": "logos-nix_36", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-package-manager", + "logos-package", + "logos-nix", + "nixpkgs" + ] + }, "locked": { "lastModified": 1775835037, "narHash": "sha256-Cti0DhkzyLQs98BSzcHWMLtGXpa3n+R+5upfSw6vKdQ=", @@ -857,82 +1370,201 @@ "type": "github" } }, - "logos-package-manager": { + "logos-package_5": { "inputs": { - "logos-nix": "logos-nix_8", - "logos-package": "logos-package", - "nix-bundle-appimage": "nix-bundle-appimage", - "nix-bundle-dir": "nix-bundle-dir_2", + "logos-nix": "logos-nix_41", "nixpkgs": [ - "logos-liblogos", - "logos-package-manager", + "logos-module-builder", + "nix-bundle-logos-module-install", + "nix-bundle-lgx", + "logos-package", "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1776374462, - "narHash": "sha256-HMkuqSLdScAWTwXEWjhqx9Yk82GiPzPIfRaHTvjG730=", + "lastModified": 1775835037, + "narHash": "sha256-Cti0DhkzyLQs98BSzcHWMLtGXpa3n+R+5upfSw6vKdQ=", "owner": "logos-co", - "repo": "logos-package-manager", - "rev": "9101875bc103214855bc6217834e22e66802ed86", + "repo": "logos-package", + "rev": "ff93a0df15ceab255f27687d22d962ea2737efbe", "type": "github" }, "original": { "owner": "logos-co", - "repo": "logos-package-manager", + "repo": "logos-package", "type": "github" } }, - "logos-package-manager_2": { + "logos-plugin-core": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_10", - "logos-liblogos": "logos-liblogos_5", - "logos-package": "logos-package_2", + "logos-module": "logos-module_2", + "logos-nix": "logos-nix_5", "nixpkgs": [ - "logos-module-viewer", - "logos-package-manager", - "logos-liblogos", + "logos-module-builder", + "logos-plugin-core", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1770753928, - "narHash": "sha256-61+3D+svB2mqyLpDFlHoIN+hBlbRGZUaueKysEiorNE=", + "lastModified": 1775835070, + "narHash": "sha256-RaJzt4sx6WrLtwhRhkGki/I+Bvt8fuC+p+oCcuLTm3g=", "owner": "logos-co", - "repo": "logos-package-manager-module", - "rev": "0cbf250ad2fec20c79dc5f61729a07c3a2bd50e1", + "repo": "logos-plugin-qt", + "rev": "78a04d603d910d864a26b158eca0882321258d44", "type": "github" }, "original": { "owner": "logos-co", - "repo": "logos-package-manager-module", + "repo": "logos-plugin-qt", "type": "github" } }, - "logos-package_2": { + "logos-plugin-qt": { "inputs": { - "nixpkgs": "nixpkgs_27" + "logos-module": "logos-module_3", + "logos-nix": "logos-nix_7", + "nixpkgs": [ + "logos-module-builder", + "logos-plugin-qt", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1768925546, - "narHash": "sha256-Y4sgYs9wtZ9sHAuKl9LUy//ReeF4/AyK8HlnZsYrSqg=", + "lastModified": 1775835070, + "narHash": "sha256-RaJzt4sx6WrLtwhRhkGki/I+Bvt8fuC+p+oCcuLTm3g=", "owner": "logos-co", - "repo": "logos-package", - "rev": "9230ae37c9d289c0c355dcf9fa40fd3be2e99f17", + "repo": "logos-plugin-qt", + "rev": "78a04d603d910d864a26b158eca0882321258d44", "type": "github" }, "original": { "owner": "logos-co", - "repo": "logos-package", + "repo": "logos-plugin-qt", + "type": "github" + } + }, + "logos-qt-mcp": { + "inputs": { + "logos-nix": "logos-nix_25", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455349, + "narHash": "sha256-rebrtH1UxC1hDuwQBwyYbGzNCrnuuqiVL7OvzUhk65k=", + "owner": "logos-co", + "repo": "logos-qt-mcp", + "rev": "c5223b4b640add09e461983b8fddbd12c8b31f4f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-qt-mcp", + "type": "github" + } + }, + "logos-standalone-app": { + "inputs": { + "logos-capability-module": "logos-capability-module", + "logos-cpp-sdk": "logos-cpp-sdk_2", + "logos-design-system": "logos-design-system", + "logos-liblogos": "logos-liblogos", + "logos-nix": "logos-nix_24", + "logos-qt-mcp": "logos-qt-mcp", + "logos-view-module-runtime": "logos-view-module-runtime", + "nix-bundle-lgx": "nix-bundle-lgx", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778000141, + "narHash": "sha256-lOeR3BgnKPeyExhWu9sVzATm2zyrriQ481jQiXXfwGM=", + "owner": "logos-co", + "repo": "logos-standalone-app", + "rev": "19246c6e58e8eef3b0fa554f696b2d41d7dcd810", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-standalone-app", + "type": "github" + } + }, + "logos-test-framework": { + "inputs": { + "logos-cpp-sdk": [ + "logos-module-builder", + "logos-cpp-sdk" + ], + "logos-nix": "logos-nix_30", + "nixpkgs": [ + "logos-module-builder", + "logos-test-framework", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775684803, + "narHash": "sha256-BnnrAjYJHW994WYAhd6e6/T7igLqJm4utjhqx1a6kLw=", + "owner": "logos-co", + "repo": "logos-test-framework", + "rev": "55b15075b5990b3c043030a3e404c7f11d57c32b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-test-framework", + "type": "github" + } + }, + "logos-view-module-runtime": { + "inputs": { + "logos-cpp-sdk": [ + "logos-module-builder", + "logos-standalone-app", + "logos-cpp-sdk" + ], + "logos-nix": "logos-nix_26", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1777551336, + "narHash": "sha256-9FAVZjvK3wLw4yzSxgAOnk2C84euYtiSmKEJNh3qVvc=", + "owner": "logos-co", + "repo": "logos-view-module-runtime", + "rev": "a00a2500ba8ef95bd89db26bcd860223dd1768c9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-view-module-runtime", "type": "github" } }, "nix-bundle-appimage": { "inputs": { - "logos-nix": "logos-nix_10", + "logos-nix": "logos-nix_20", "nix-bundle-dir": "nix-bundle-dir", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-package-manager", "nix-bundle-appimage", @@ -956,15 +1588,23 @@ }, "nix-bundle-appimage_2": { "inputs": { - "nix-bundle-dir": "nix-bundle-dir_3", - "nixpkgs": "nixpkgs_23" + "logos-nix": "logos-nix_37", + "nix-bundle-dir": "nix-bundle-dir_5", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-package-manager", + "nix-bundle-appimage", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1772047346, - "narHash": "sha256-RUsTUxKCxuQ3+D2LfBbK0EX1vF7HNMkpWgOGFfZbrEg=", + "lastModified": 1774455478, + "narHash": "sha256-S8IMfdDc+2Wwri0krLDsIUwSqmwanmvHAJWHOFo8ykk=", "owner": "logos-co", "repo": "nix-bundle-appimage", - "rev": "4d68437c97ac59c3c70c1b2b116235c434d571a8", + "rev": "2428125a4a1b34ad9119efa97edb98676283e3da", "type": "github" }, "original": { @@ -975,8 +1615,10 @@ }, "nix-bundle-dir": { "inputs": { - "logos-nix": "logos-nix_11", + "logos-nix": "logos-nix_21", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-package-manager", "nix-bundle-appimage", @@ -999,8 +1641,10 @@ }, "nix-bundle-dir_2": { "inputs": { - "logos-nix": "logos-nix_12", + "logos-nix": "logos-nix_22", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-package-manager", "nix-bundle-dir", @@ -1024,19 +1668,22 @@ }, "nix-bundle-dir_3": { "inputs": { + "logos-nix": "logos-nix_29", "nixpkgs": [ - "logos-module-viewer", - "logos-liblogos", - "nix-bundle-appimage", + "logos-module-builder", + "logos-standalone-app", + "nix-bundle-lgx", + "nix-bundle-dir", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1771971384, - "narHash": "sha256-fq0H+sxQhkGN054jdN+ZfHZibbOjHA+KD5SpRH78T1g=", + "lastModified": 1774455641, + "narHash": "sha256-HrVJguPxhIoZMCH+x8Wooa0tE6slUhgNOU6P89t2uQc=", "owner": "logos-co", "repo": "nix-bundle-dir", - "rev": "1ecb9662145a1ad84007a970b4bef50a4af159c9", + "rev": "3d155cab09051703a0b02ff2de166a53c30cbca8", "type": "github" }, "original": { @@ -1047,14 +1694,21 @@ }, "nix-bundle-dir_4": { "inputs": { - "nixpkgs": "nixpkgs_24" + "logos-nix": "logos-nix_33", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-lgx", + "nix-bundle-dir", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1771971384, - "narHash": "sha256-fq0H+sxQhkGN054jdN+ZfHZibbOjHA+KD5SpRH78T1g=", + "lastModified": 1774455641, + "narHash": "sha256-HrVJguPxhIoZMCH+x8Wooa0tE6slUhgNOU6P89t2uQc=", "owner": "logos-co", "repo": "nix-bundle-dir", - "rev": "1ecb9662145a1ad84007a970b4bef50a4af159c9", + "rev": "3d155cab09051703a0b02ff2de166a53c30cbca8", "type": "github" }, "original": { @@ -1063,6 +1717,188 @@ "type": "github" } }, + "nix-bundle-dir_5": { + "inputs": { + "logos-nix": "logos-nix_38", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-package-manager", + "nix-bundle-appimage", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773961179, + "narHash": "sha256-bpaTvz//R8WFP5xnnDLv3a9l7unDmBwJjCewx3wCjzM=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "cd214dbf15487d80967389847ae2210468be6ebf", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nix-bundle-dir_6": { + "inputs": { + "logos-nix": "logos-nix_39", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-package-manager", + "nix-bundle-dir", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455641, + "narHash": "sha256-HrVJguPxhIoZMCH+x8Wooa0tE6slUhgNOU6P89t2uQc=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "3d155cab09051703a0b02ff2de166a53c30cbca8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nix-bundle-dir_7": { + "inputs": { + "logos-nix": "logos-nix_42", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "nix-bundle-lgx", + "nix-bundle-dir", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455641, + "narHash": "sha256-HrVJguPxhIoZMCH+x8Wooa0tE6slUhgNOU6P89t2uQc=", + "owner": "logos-co", + "repo": "nix-bundle-dir", + "rev": "3d155cab09051703a0b02ff2de166a53c30cbca8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-dir", + "type": "github" + } + }, + "nix-bundle-lgx": { + "inputs": { + "logos-nix": "logos-nix_27", + "logos-package": "logos-package_2", + "nix-bundle-dir": "nix-bundle-dir_3", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775836380, + "narHash": "sha256-XbBPcMuDFA/SxYVw9TIRQbhie5Vj5MqwdU+Gh1iR1LA=", + "owner": "logos-co", + "repo": "nix-bundle-lgx", + "rev": "9d8f8602b1574ec9ac4c9b31ae0c92570221c268", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-lgx", + "type": "github" + } + }, + "nix-bundle-lgx_2": { + "inputs": { + "logos-nix": "logos-nix_31", + "logos-package": "logos-package_3", + "nix-bundle-dir": "nix-bundle-dir_4", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-lgx", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775836380, + "narHash": "sha256-XbBPcMuDFA/SxYVw9TIRQbhie5Vj5MqwdU+Gh1iR1LA=", + "owner": "logos-co", + "repo": "nix-bundle-lgx", + "rev": "9d8f8602b1574ec9ac4c9b31ae0c92570221c268", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-lgx", + "type": "github" + } + }, + "nix-bundle-lgx_3": { + "inputs": { + "logos-nix": "logos-nix_40", + "logos-package": "logos-package_5", + "nix-bundle-dir": "nix-bundle-dir_7", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "nix-bundle-lgx", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775836380, + "narHash": "sha256-XbBPcMuDFA/SxYVw9TIRQbhie5Vj5MqwdU+Gh1iR1LA=", + "owner": "logos-co", + "repo": "nix-bundle-lgx", + "rev": "9d8f8602b1574ec9ac4c9b31ae0c92570221c268", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-lgx", + "type": "github" + } + }, + "nix-bundle-logos-module-install": { + "inputs": { + "logos-nix": "logos-nix_34", + "logos-package-manager": "logos-package-manager_2", + "nix-bundle-lgx": "nix-bundle-lgx_3", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775839388, + "narHash": "sha256-0QH146bzL2kKBYJq2yA35iPwug55j2xjEyKCS7tjhvg=", + "owner": "logos-co", + "repo": "nix-bundle-logos-module-install", + "rev": "89cc9ea91275396d589c767d76926459ac77ef20", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-logos-module-install", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1769461804, @@ -1305,11 +2141,11 @@ }, "nixpkgs_23": { "locked": { - "lastModified": 1771848320, - "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "2fc6539b481e1d2569f25f8799236694180c0993", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", "type": "github" }, "original": { @@ -1321,11 +2157,11 @@ }, "nixpkgs_24": { "locked": { - "lastModified": 1770562336, - "narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=", + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "d6c71932130818840fc8fe9509cf50be8c64634f", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", "type": "github" }, "original": { @@ -1369,11 +2205,43 @@ }, "nixpkgs_27": { "locked": { - "lastModified": 1768127708, - "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=", + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_28": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_29": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", "type": "github" }, "original": { @@ -1399,6 +2267,166 @@ "type": "github" } }, + "nixpkgs_30": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_31": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_32": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_33": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_34": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_35": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_36": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_37": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_38": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_39": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_4": { "locked": { "lastModified": 1759036355, @@ -1415,6 +2443,86 @@ "type": "github" } }, + "nixpkgs_40": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_41": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_42": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_43": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_44": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_5": { "locked": { "lastModified": 1759036355, @@ -1497,8 +2605,10 @@ }, "process-stats": { "inputs": { - "logos-nix": "logos-nix_13", + "logos-nix": "logos-nix_23", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "process-stats", "logos-nix", @@ -1522,13 +2632,7 @@ "root": { "inputs": { "logos-blockchain": "logos-blockchain", - "logos-core": "logos-core", - "logos-liblogos": "logos-liblogos", - "logos-module-viewer": "logos-module-viewer", - "nixpkgs": [ - "logos-liblogos", - "nixpkgs" - ] + "logos-module-builder": "logos-module-builder" } }, "rust-overlay": { diff --git a/flake.nix b/flake.nix index 3e8cde8..576a866 100644 --- a/flake.nix +++ b/flake.nix @@ -2,162 +2,45 @@ description = "Logos Blockchain Module - Qt6 Plugin"; inputs = { - nixpkgs.follows = "logos-liblogos/nixpkgs"; - - logos-liblogos.url = "github:logos-co/logos-liblogos"; - logos-core.url = "github:logos-co/logos-cpp-sdk"; - + logos-module-builder.url = "github:logos-co/logos-module-builder"; logos-blockchain.url = "github:logos-blockchain/logos-blockchain?rev=88941ff33f2e028591b9d0ed2549a328d54f0cfa"; # pre-0.1.3 + potential note fixes - - logos-module-viewer.url = "github:logos-co/logos-module-viewer"; }; - outputs = - { - self, - nixpkgs, - logos-core, - logos-blockchain, - logos-module-viewer, - ... - }: - let - lib = nixpkgs.lib; + outputs = inputs@{ logos-module-builder, ... }: + logos-module-builder.lib.mkLogosModule { + src = ./.; + configFile = ./metadata.json; + flakeInputs = inputs; - systems = [ - "x86_64-linux" - "aarch64-linux" - "x86_64-darwin" - "aarch64-darwin" - ]; + externalLibInputs = { + logos_blockchain = inputs.logos-blockchain; + }; - forAll = lib.genAttrs systems; + tests = { + dir = ./tests; + mockCLibs = [ "logos_blockchain" ]; + }; - mkPkgs = system: import nixpkgs { inherit system; }; - in - { - packages = forAll ( - system: - let - pkgs = mkPkgs system; - llvmPkgs = pkgs.llvmPackages; + preConfigure = { externalLibs }: '' + if [ -d "${externalLibs.logos_blockchain}/circuits" ]; then + echo "Staging zk circuits from logos-blockchain..." + cp -r "${externalLibs.logos_blockchain}/circuits" ./circuits + chmod -R u+w ./circuits + else + echo "WARNING: no circuits/ found in logos-blockchain derivation" + fi + ''; - logosCore = logos-core.packages.${system}.default; - logosBlockchainC = logos-blockchain.packages.${system}.logos-blockchain-c; - - logosBlockchainModule = pkgs.stdenv.mkDerivation { - pname = "logos-blockchain-module"; - version = "dev"; - src = ./.; - - nativeBuildInputs = [ - pkgs.cmake - pkgs.ninja - pkgs.pkg-config - pkgs.qt6.wrapQtAppsHook - ]; - - buildInputs = [ - pkgs.qt6.qtbase - pkgs.qt6.qtremoteobjects - pkgs.qt6.qttools - llvmPkgs.clang - llvmPkgs.libclang - logosBlockchainC - ] - ++ lib.optionals pkgs.stdenv.isDarwin [ - pkgs.libiconv - pkgs.cacert - ]; - - LIBCLANG_PATH = "${llvmPkgs.libclang.lib}/lib"; - CLANG_PATH = "${llvmPkgs.clang}/bin/clang"; - SSL_CERT_FILE = lib.optionalString pkgs.stdenv.isDarwin "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; - - cmakeFlags = [ - "-DLOGOS_CORE_ROOT=${logosCore}" - "-DLOGOS_BLOCKCHAIN_LIB=${logosBlockchainC}/lib" - "-DLOGOS_BLOCKCHAIN_INCLUDE=${logosBlockchainC}/include" - ]; - - postInstall = '' - mkdir $out/share - cp -r ${logosBlockchainC}/circuits $out/share - ''; - - # Logos Core Edge-case - # The current version of Logos Core expects circuits' binaries under `lib/circuits/`. - # Until we address this in Logos Core, we use this hook to include to ensure the circuits' binaries - # are included in the binary bundle and avoid the circuits being mangled by Nix (which did that when - # copying them in a previous phase). - postFixup = '' - cp -r ${logosBlockchainC}/circuits $out/lib/circuits - ''; - }; - in - { - lib = logosBlockchainModule; - default = logosBlockchainModule; - } - ); - - apps = forAll ( - system: - let - pkgs = mkPkgs system; - logosBlockchainModuleLib = self.packages.${system}.lib; - logosModuleViewer = logos-module-viewer.packages.${system}.default; - extension = if pkgs.stdenv.isDarwin then "dylib" - else if pkgs.stdenv.hostPlatform.isWindows then "dll" - else "so"; - inspectModule = { - type = "app"; - program = - "${pkgs.writeShellScriptBin "inspect-module" '' - exec ${logosModuleViewer}/bin/logos-module-viewer \ - --module ${logosBlockchainModuleLib}/lib/liblogos_blockchain_module.${extension} - ''}/bin/inspect-module"; - }; - in - { - inspect-module = inspectModule; - default = inspectModule; - } - ); - - devShells = forAll ( - system: - let - pkgs = mkPkgs system; - pkg = self.packages.${system}.default; - logosCore = logos-core.packages.${system}.default; - logosBlockchainC = logos-blockchain.packages.${system}.logos-blockchain-c; - in - { - default = pkgs.mkShell { - inputsFrom = [ pkg ]; - - inherit (pkg) - LIBCLANG_PATH - CLANG_PATH; - - LOGOS_CORE_ROOT = "${logosCore}"; - LOGOS_BLOCKCHAIN_LIB = "${logosBlockchainC}/lib"; - LOGOS_BLOCKCHAIN_INCLUDE = "${logosBlockchainC}/include"; - - shellHook = '' - BLUE='\e[1;34m' - GREEN='\e[1;32m' - RESET='\e[0m' - - echo -e "\n''${BLUE}=== Logos Blockchain Module Development Environment ===''${RESET}" - echo -e "''${GREEN}LOGOS_CORE_ROOT:''${RESET} $LOGOS_CORE_ROOT" - echo -e "''${GREEN}LOGOS_BLOCKCHAIN_LIB:''${RESET} $LOGOS_BLOCKCHAIN_LIB" - echo -e "''${GREEN}LOGOS_BLOCKCHAIN_INCLUDE:''${RESET} $LOGOS_BLOCKCHAIN_INCLUDE" - echo -e "''${BLUE}---------------------------------------------------------''${RESET}" - ''; - }; - } - ); + # Logos Core Edge-case + # The current version of Logos Core expects circuits' binaries under `lib/circuits/`. + # Until we address this in Logos Core, we use this hook to include to ensure the circuits' binaries + # are included in the binary bundle and avoid the circuits being mangled by Nix (which did that when + # copying them in a previous phase). + postInstall = '' + if [ -d "$LOGOS_MODULE_SOURCE_DIR/circuits" ]; then + cp -r "$LOGOS_MODULE_SOURCE_DIR/circuits" "$out/lib/circuits" + chmod -R u+w "$out/lib/circuits" + fi + ''; }; } diff --git a/justfile b/justfile index 6a3a553..d35b6da 100644 --- a/justfile +++ b/justfile @@ -1,13 +1,13 @@ default: build +# Inside `nix develop` / `ws develop logos-blockchain-module` the module-builder +# provides LOGOS_CPP_SDK_ROOT and LOGOS_MODULE_BUILDER_ROOT — CMake picks them +# up automatically via the logos_module() macro, no explicit -D flags needed. configure: - cmake -S . -B build -G Ninja \ - ${LOGOS_CORE_ROOT:+-DLOGOS_CORE_ROOT="$LOGOS_CORE_ROOT"} \ - ${LOGOS_BLOCKCHAIN_LIB:+-DLOGOS_BLOCKCHAIN_LIB="$LOGOS_BLOCKCHAIN_LIB"} \ - ${LOGOS_BLOCKCHAIN_INCLUDE:+-DLOGOS_BLOCKCHAIN_INCLUDE="$LOGOS_BLOCKCHAIN_INCLUDE"} + cmake -S . -B build -G Ninja build: configure - cmake --build build --parallel --target logos_blockchain_module + cmake --build build --parallel --target liblogos_blockchain_module_module_plugin clean: rm -rf build result diff --git a/metadata.json b/metadata.json index 4141552..3b07bdf 100644 --- a/metadata.json +++ b/metadata.json @@ -5,16 +5,29 @@ "author": "Logos Blockchain Team", "type": "core", "category": "blockchain", - "main": "liblogos_blockchain_module", + "main": "liblogos_blockchain_module_plugin", "dependencies": [], "capabilities": [], "include": [ "liblogos_blockchain.dylib", "liblogos_blockchain.so", "liblogos_blockchain.dll", - "liblogos_blockchain_module.dylib", - "liblogos_blockchain_module.so", - "liblogos_blockchain_module.dll", + "liblogos_blockchain_module_plugin.dylib", + "liblogos_blockchain_module_plugin.so", + "liblogos_blockchain_module_plugin.dll", "circuits" - ] -} \ No newline at end of file + ], + + "nix": { + "packages": { + "build": [], + "runtime": [] + }, + "external_libraries": [ + { "name": "logos_blockchain" } + ], + "cmake": { + "extra_include_dirs": ["lib"] + } + } +} diff --git a/src/i_logos_blockchain_module.h b/src/i_logos_blockchain_module.h index a9467d4..e3ddffe 100644 --- a/src/i_logos_blockchain_module.h +++ b/src/i_logos_blockchain_module.h @@ -2,7 +2,7 @@ #define I_LOGOS_BLOCKCHAIN_MODULE_API_H #include -#include +#include "interface.h" class ILogosBlockchainModule { public: diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index b1b8613..027105a 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -4,12 +4,31 @@ #include #include #include +#include +#include +#include #include +#include // Define static member LogosBlockchainModule* LogosBlockchainModule::s_instance = nullptr; namespace { + // Rust `File::open` / `deserialize_config_at_path` only accept real filesystem paths. QML often + // passes `file:///...` URLs; strip to a local path when applicable. + QString localPathFromFileUrl(const QString& s) { + if (s.isEmpty()) { + return s; + } + if (s.startsWith(QStringLiteral("file:"), Qt::CaseInsensitive)) { + const QUrl u(s); + if (u.isLocalFile()) { + return QDir::toNativeSeparators(u.toLocalFile()); + } + } + return s; + } + // Use the C API type Hash (from logos_blockchain.h) to define address/hash byte size. constexpr int ADDRESS_BYTES = sizeof(Hash); constexpr int ADDRESS_HEX_LEN = ADDRESS_BYTES * 2; @@ -263,14 +282,14 @@ int LogosBlockchainModule::start(const QString& config_path, const QString& depl } } - qInfo() << "Starting the node with the configuration file:" << effective_config_path; - qInfo() << "Using deployment:" << (deployment.isEmpty() ? "" : deployment); + effective_config_path = localPathFromFileUrl(effective_config_path); + const QString deployment_path = localPathFromFileUrl(deployment); const QByteArray config_path_buffer = effective_config_path.toUtf8(); const char* config_path_ptr = effective_config_path.isEmpty() ? nullptr : config_path_buffer.constData(); - const QByteArray deployment_buffer = deployment.toUtf8(); - const char* deployment_ptr = deployment.isEmpty() ? nullptr : deployment_buffer.constData(); + const QByteArray deployment_buffer = deployment_path.toUtf8(); + const char* deployment_ptr = deployment_path.isEmpty() ? nullptr : deployment_buffer.constData(); auto [value, error] = start_lb_node(config_path_ptr, deployment_ptr); qInfo() << "Start node returned with value and error."; diff --git a/src/logos_blockchain_module.h b/src/logos_blockchain_module.h index 131e500..b0ea8b9 100644 --- a/src/logos_blockchain_module.h +++ b/src/logos_blockchain_module.h @@ -13,7 +13,7 @@ extern "C" { class LogosBlockchainModule final : public QObject, public PluginInterface, public ILogosBlockchainModule { Q_OBJECT - Q_PLUGIN_METADATA(IID ILogosBlockchainModule_iid FILE LOGOS_BLOCKCHAIN_MODULE_METADATA_FILE) + Q_PLUGIN_METADATA(IID ILogosBlockchainModule_iid FILE "metadata.json") Q_INTERFACES(PluginInterface) public: From 7d2ae4a69d72998048a7a428735084104679d4ac Mon Sep 17 00:00:00 2001 From: Logos Workspace Date: Wed, 6 May 2026 13:37:19 -0400 Subject: [PATCH 2/2] add tests add tests update readme --- .github/workflows/ci.yml | 45 ++ README.md | 33 +- tests/CMakeLists.txt | 50 ++ tests/main.cpp | 3 + tests/mocks/mock_logos_blockchain.cpp | 159 ++++++ tests/stubs/logos_blockchain.h | 131 +++++ tests/test_blockchain.cpp | 733 ++++++++++++++++++++++++++ 7 files changed, 1122 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 tests/CMakeLists.txt create mode 100644 tests/main.cpp create mode 100644 tests/mocks/mock_logos_blockchain.cpp create mode 100644 tests/stubs/logos_blockchain.h create mode 100644 tests/test_blockchain.cpp diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..fcd7f85 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + branches: [master] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: cachix/install-nix-action@v27 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - uses: cachix/cachix-action@v15 + with: + name: logos-co + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + + - name: Build module + run: nix build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: cachix/install-nix-action@v27 + with: + extra_nix_config: | + experimental-features = nix-command flakes + + - uses: cachix/cachix-action@v15 + with: + name: logos-co + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + + - name: Run unit tests + run: nix build '.#checks.x86_64-linux.unit-tests' -L diff --git a/README.md b/README.md index aceea33..1cca043 100644 --- a/README.md +++ b/README.md @@ -2,40 +2,9 @@ A Logos core module that wraps the [logos-blockchain](https://github.com/logos-blockchain/logos-blockchain) C bindings and ships the zk circuit binaries needed at runtime. -Built with [logos-module-builder](https://github.com/logos-co/logos-module-builder): `flake.nix`, `CMakeLists.txt`, and `metadata.json` are the only build-system files. The module-builder's `mkLogosModule` pulls the prebuilt `logos-blockchain-c` derivation (lib + header) in via `externalLibInputs`; the circuits directory is staged separately in `preConfigure` / `postInstall` because it's runtime data rather than a library. - ### Build and inspect ```bash -# In the workspace (preferred): -ws build logos-blockchain-module -ws build logos-blockchain-module --auto-local # pick up local dep overrides - -# Inspect the built plugin -lm ./result/lib/liblogos_blockchain_module_plugin.so - -# Standalone -nix build # -> result/lib/.so + result/lib/circuits/ -nix develop # cmake/ninja iteration +nix build '.#lgx' ``` -### Files - -- `flake.nix` — `mkLogosModule` call + circuits staging -- `CMakeLists.txt` — single `logos_module()` macro + C++20 bump -- `metadata.json` — module identity, deps, and `nix.external_libraries` -- `src/` — plugin sources (Q_OBJECT + Q_INVOKABLE API) - -### Troubleshooting - -#### Nix + IDE Integration -If your IDE reports that a file doesn't belong to the project or that files cannot be found, the CMake cache is likely missing the Nix-provided paths. This happens when the IDE runs CMake on its own, outside the Nix environment, leaving `LOGOS_CPP_SDK_ROOT` / `LOGOS_MODULE_BUILDER_ROOT` unset. - -To fix it: - -1. **Regenerate the cache from within the Nix shell** — this provides the required Nix paths and writes them into `build/CMakeCache.txt`: - ```bash - nix develop -c cmake -B build -GNinja - ``` - -2. **Reload the CMake project without resetting the cache.** On RustRover: open the CMake tool window (**View → Tool Windows → CMake**) and click **Reload** (↺). Resetting the cache would wipe the paths you just wrote. diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..01a4ea8 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,50 @@ +cmake_minimum_required(VERSION 3.14) +project(BlockchainModuleTests LANGUAGES CXX) + +include(LogosTest) + +# Unit tests (mocked logos_blockchain) + +logos_test( + NAME blockchain_module_tests + MODULE_SOURCES + ../src/logos_blockchain_module.cpp + TEST_SOURCES + main.cpp + test_blockchain.cpp + MOCK_C_SOURCES + mocks/mock_logos_blockchain.cpp + EXTRA_INCLUDES + stubs +) + +# Integration tests (real logos_blockchain library) + +find_library(LIBLOGOS_BLOCKCHAIN_PATH + NAMES liblogos_blockchain.so liblogos_blockchain.dylib + PATHS ${CMAKE_CURRENT_SOURCE_DIR}/../lib + NO_DEFAULT_PATH) + +if(LIBLOGOS_BLOCKCHAIN_PATH) + message(STATUS "[BlockchainTests] logos_blockchain found: ${LIBLOGOS_BLOCKCHAIN_PATH} - building integration tests") + + logos_test( + NAME blockchain_module_integration_tests + MODULE_SOURCES + ../src/logos_blockchain_module.cpp + TEST_SOURCES + main.cpp + test_blockchain.cpp + EXTRA_INCLUDES + ../lib + EXTRA_LINK_LIBS + ${LIBLOGOS_BLOCKCHAIN_PATH} + ) + + get_filename_component(LIBLOGOS_BLOCKCHAIN_DIR "${LIBLOGOS_BLOCKCHAIN_PATH}" DIRECTORY) + set_target_properties(blockchain_module_integration_tests PROPERTIES + BUILD_RPATH "${LIBLOGOS_BLOCKCHAIN_DIR}" + ) +else() + message(STATUS "[BlockchainTests] logos_blockchain not found in ../lib - skipping integration tests") +endif() diff --git a/tests/main.cpp b/tests/main.cpp new file mode 100644 index 0000000..93a8096 --- /dev/null +++ b/tests/main.cpp @@ -0,0 +1,3 @@ +#include + +LOGOS_TEST_MAIN() diff --git a/tests/mocks/mock_logos_blockchain.cpp b/tests/mocks/mock_logos_blockchain.cpp new file mode 100644 index 0000000..5374ff3 --- /dev/null +++ b/tests/mocks/mock_logos_blockchain.cpp @@ -0,0 +1,159 @@ +// Mock implementation of logos_blockchain C functions. +// Replaces the real Rust library at link time during unit tests. +// Return values are controlled via LogosCMockStore. + +#include +#include +#include +#include + +static char s_fakeNode = 0; +static CryptarchiaInfo s_fakeCryptarchiaInfo = {}; + +// Known-address mock storage (up to 4 addresses) +static uint8_t s_mockAddr0[32]; +static uint8_t s_mockAddr1[32]; +static uint8_t s_mockAddr2[32]; +static uint8_t s_mockAddr3[32]; +static uint8_t* s_mockAddrs[] = { s_mockAddr0, s_mockAddr1, s_mockAddr2, s_mockAddr3 }; + +extern "C" { + +bool is_ok(const OperationStatus* status) { + return status && *status == 0; +} + +OperationStatus generate_user_config(GenerateConfigArgs args) { + LOGOS_CMOCK_RECORD("generate_user_config"); + return LOGOS_CMOCK_RETURN(int, "generate_user_config"); +} + +NodeResult start_lb_node(const char* config_path, const char* deployment) { + LOGOS_CMOCK_RECORD("start_lb_node"); + int ok = LOGOS_CMOCK_RETURN(int, "start_lb_node"); + NodeResult result; + result.value = ok ? reinterpret_cast(&s_fakeNode) : nullptr; + result.error = ok ? 0 : 1; + return result; +} + +OperationStatus stop_node(LogosBlockchainNode* node) { + LOGOS_CMOCK_RECORD("stop_node"); + return 0; +} + +OperationStatus subscribe_to_new_blocks(LogosBlockchainNode* node, BlockCallback callback) { + LOGOS_CMOCK_RECORD("subscribe_to_new_blocks"); + return LOGOS_CMOCK_RETURN(int, "subscribe_to_new_blocks"); +} + +BalanceResult get_balance(LogosBlockchainNode* node, const uint8_t* address, const void* reserved) { + LOGOS_CMOCK_RECORD("get_balance"); + BalanceResult result; + result.value = static_cast(LOGOS_CMOCK_RETURN(int, "get_balance_value")); + result.error = LOGOS_CMOCK_RETURN(int, "get_balance_error"); + return result; +} + +TransferHashResult transfer_funds(LogosBlockchainNode* node, const TransferFundsArguments* args) { + LOGOS_CMOCK_RECORD("transfer_funds"); + TransferHashResult result; + memset(result.value, 0xAB, sizeof(Hash)); + result.error = LOGOS_CMOCK_RETURN(int, "transfer_funds_error"); + return result; +} + +KnownAddressesResult get_known_addresses(LogosBlockchainNode* node) { + LOGOS_CMOCK_RECORD("get_known_addresses"); + KnownAddressesResult result; + int err = LOGOS_CMOCK_RETURN(int, "get_known_addresses_error"); + result.error = err; + if (err == 0) { + int count = LOGOS_CMOCK_RETURN(int, "get_known_addresses_count"); + if (count > 4) count = 4; + memset(s_mockAddr0, 0x11, 32); + memset(s_mockAddr1, 0x22, 32); + memset(s_mockAddr2, 0x33, 32); + memset(s_mockAddr3, 0x44, 32); + result.value.addresses = s_mockAddrs; + result.value.len = static_cast(count); + } else { + result.value.addresses = nullptr; + result.value.len = 0; + } + return result; +} + +OperationStatus free_known_addresses(KnownAddresses addrs) { + LOGOS_CMOCK_RECORD("free_known_addresses"); + return 0; +} + +BlendHashResult blend_join_as_core_node( + LogosBlockchainNode* node, + const uint8_t* provider_id, + const uint8_t* zk_id, + const uint8_t* locked_note_id, + const char** locators, + size_t locators_count) +{ + LOGOS_CMOCK_RECORD("blend_join_as_core_node"); + BlendHashResult result; + memset(result.value, 0xCD, sizeof(Hash)); + result.error = LOGOS_CMOCK_RETURN(int, "blend_join_as_core_node_error"); + return result; +} + +StringResult get_block(LogosBlockchainNode* node, const HeaderId* header_id) { + LOGOS_CMOCK_RECORD("get_block"); + StringResult result; + const char* json = LOGOS_CMOCK_RETURN_STRING("get_block"); + result.value = json ? strdup(json) : nullptr; + result.error = LOGOS_CMOCK_RETURN(int, "get_block_error"); + return result; +} + +StringResult get_blocks(LogosBlockchainNode* node, uint64_t from_slot, uint64_t to_slot) { + LOGOS_CMOCK_RECORD("get_blocks"); + StringResult result; + const char* json = LOGOS_CMOCK_RETURN_STRING("get_blocks"); + result.value = json ? strdup(json) : nullptr; + result.error = LOGOS_CMOCK_RETURN(int, "get_blocks_error"); + return result; +} + +StringResult get_transaction(LogosBlockchainNode* node, const TxHash* tx_hash) { + LOGOS_CMOCK_RECORD("get_transaction"); + StringResult result; + const char* json = LOGOS_CMOCK_RETURN_STRING("get_transaction"); + result.value = json ? strdup(json) : nullptr; + result.error = LOGOS_CMOCK_RETURN(int, "get_transaction_error"); + return result; +} + +CryptarchiaInfoResult get_cryptarchia_info(LogosBlockchainNode* node) { + LOGOS_CMOCK_RECORD("get_cryptarchia_info"); + CryptarchiaInfoResult result; + memset(&s_fakeCryptarchiaInfo, 0, sizeof(s_fakeCryptarchiaInfo)); + s_fakeCryptarchiaInfo.slot = static_cast(LOGOS_CMOCK_RETURN(int, "cryptarchia_slot")); + s_fakeCryptarchiaInfo.height = static_cast(LOGOS_CMOCK_RETURN(int, "cryptarchia_height")); + s_fakeCryptarchiaInfo.mode = static_cast(LOGOS_CMOCK_RETURN(int, "cryptarchia_mode")); + memset(s_fakeCryptarchiaInfo.lib, 0xEE, 32); + memset(s_fakeCryptarchiaInfo.tip, 0xFF, 32); + result.value = &s_fakeCryptarchiaInfo; + result.error = LOGOS_CMOCK_RETURN(int, "get_cryptarchia_info_error"); + return result; +} + +OperationStatus free_cryptarchia_info(CryptarchiaInfo* info) { + LOGOS_CMOCK_RECORD("free_cryptarchia_info"); + return 0; +} + +OperationStatus free_cstring(char* s) { + LOGOS_CMOCK_RECORD("free_cstring"); + free(s); + return 0; +} + +} // extern "C" diff --git a/tests/stubs/logos_blockchain.h b/tests/stubs/logos_blockchain.h new file mode 100644 index 0000000..22d5f62 --- /dev/null +++ b/tests/stubs/logos_blockchain.h @@ -0,0 +1,131 @@ +// Stub header for logos_blockchain — provides the same declarations as the real +// Rust-generated header so that logos_blockchain_module sources compile in tests. + +#ifndef LOGOS_BLOCKCHAIN_H +#define LOGOS_BLOCKCHAIN_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// 32-byte hash/address types +typedef uint8_t Hash[32]; +typedef uint8_t HeaderId[32]; +typedef uint8_t TxHash[32]; + +// Opaque node handle +typedef struct LogosBlockchainNode LogosBlockchainNode; + +// Operation status (0 = OK) +typedef int OperationStatus; + +// Deployment enums +typedef enum { WellKnown, Custom } DeploymentType; +typedef enum { Devnet } WellKnownDeployment; + +// Consensus state enum +typedef enum { Bootstrapping, Online } State; + +// Deployment configuration +typedef struct { + DeploymentType deployment_type; + WellKnownDeployment well_known_deployment; + const char* custom_deployment_config_path; +} Deployment; + +// Arguments for generate_user_config +typedef struct { + const char** initial_peers; + const uint32_t* initial_peers_count; + const char* output; + const uint16_t* net_port; + const uint16_t* blend_port; + const char* http_addr; + const char* external_address; + const bool* no_public_ip_check; + const Deployment* deployment; + const char* state_path; +} GenerateConfigArgs; + +// Arguments for transfer_funds +typedef struct { + const HeaderId* optional_tip; + const uint8_t* change_public_key; + const uint8_t* const* funding_public_keys; + size_t funding_public_keys_len; + const uint8_t* recipient_public_key; + uint64_t amount; +} TransferFundsArguments; + +// Known addresses result container +typedef struct { + uint8_t** addresses; + size_t len; +} KnownAddresses; + +// Cryptarchia consensus info +typedef struct { + uint8_t lib[32]; + uint8_t tip[32]; + uint64_t slot; + uint64_t height; + State mode; +} CryptarchiaInfo; + +// Result types (C++ structured bindings decompose these) +typedef struct { LogosBlockchainNode* value; OperationStatus error; } NodeResult; +typedef struct { uint64_t value; OperationStatus error; } BalanceResult; +typedef struct { Hash value; OperationStatus error; } TransferHashResult; +typedef struct { KnownAddresses value; OperationStatus error; } KnownAddressesResult; +typedef struct { Hash value; OperationStatus error; } BlendHashResult; +typedef struct { char* value; OperationStatus error; } StringResult; +typedef struct { CryptarchiaInfo* value; OperationStatus error; } CryptarchiaInfoResult; + +// Block event callback +typedef void (*BlockCallback)(const char* block_json); + +// Status check +bool is_ok(const OperationStatus* status); + +// Lifecycle +OperationStatus generate_user_config(GenerateConfigArgs args); +NodeResult start_lb_node(const char* config_path, const char* deployment); +OperationStatus stop_node(LogosBlockchainNode* node); +OperationStatus subscribe_to_new_blocks(LogosBlockchainNode* node, BlockCallback callback); + +// Wallet +BalanceResult get_balance(LogosBlockchainNode* node, const uint8_t* address, const void* reserved); +TransferHashResult transfer_funds(LogosBlockchainNode* node, const TransferFundsArguments* args); +KnownAddressesResult get_known_addresses(LogosBlockchainNode* node); +OperationStatus free_known_addresses(KnownAddresses addrs); + +// Blend +BlendHashResult blend_join_as_core_node( + LogosBlockchainNode* node, + const uint8_t* provider_id, + const uint8_t* zk_id, + const uint8_t* locked_note_id, + const char** locators, + size_t locators_count); + +// Explorer +StringResult get_block(LogosBlockchainNode* node, const HeaderId* header_id); +StringResult get_blocks(LogosBlockchainNode* node, uint64_t from_slot, uint64_t to_slot); +StringResult get_transaction(LogosBlockchainNode* node, const TxHash* tx_hash); + +// Cryptarchia +CryptarchiaInfoResult get_cryptarchia_info(LogosBlockchainNode* node); +OperationStatus free_cryptarchia_info(CryptarchiaInfo* info); + +// Memory management +OperationStatus free_cstring(char* s); + +#ifdef __cplusplus +} +#endif + +#endif // LOGOS_BLOCKCHAIN_H diff --git a/tests/test_blockchain.cpp b/tests/test_blockchain.cpp new file mode 100644 index 0000000..3491450 --- /dev/null +++ b/tests/test_blockchain.cpp @@ -0,0 +1,733 @@ +// Unit tests for LogosBlockchainModule. +// All logos_blockchain C functions are mocked at link time via mock_logos_blockchain.cpp. + +#include +#include "logos_blockchain_module.h" + +#include +#include +#include + +// 64-char hex string = 32 bytes (valid address/hash) +static const QString VALID_HEX = QString(64, 'a'); +static const QString VALID_HEX_WITH_PREFIX = "0x" + QString(64, 'b'); + +// Helper: create a module with a running (mocked) node. +// Sets up circuits directory, mock LogosAPI, and calls start(). +static LogosBlockchainModule* createStartedModule(LogosTestContext& t, QTemporaryDir& tmpDir) { + QDir dir(tmpDir.path()); + dir.mkpath("circuits"); + QFile f(dir.filePath("circuits/dummy.bin")); + f.open(QIODevice::WriteOnly); + f.write("x"); + f.close(); + + t.api()->setProperty("modulePath", tmpDir.path()); + + auto* module = new LogosBlockchainModule(); + t.initLegacy(module); + + t.mockCFunction("start_lb_node").returns(1); + t.mockCFunction("subscribe_to_new_blocks").returns(0); + + int rc = module->start(tmpDir.filePath("config.json"), ""); + if (rc != 0) { + delete module; + return nullptr; + } + return module; +} + +// ============================================================================ +// Core metadata +// ============================================================================ + +LOGOS_TEST(name_returns_module_name) { + LogosBlockchainModule module; + LOGOS_ASSERT_EQ(module.name(), QString("liblogos_blockchain_module")); +} + +LOGOS_TEST(version_returns_module_version) { + LogosBlockchainModule module; + LOGOS_ASSERT_EQ(module.version(), QString("1.0.0")); +} + +// ============================================================================ +// generate_user_config +// ============================================================================ + +LOGOS_TEST(generate_user_config_returns_0_on_success) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + + t.mockCFunction("generate_user_config").returns(0); + + QVariantMap args; + args["output"] = "/tmp/test-config.json"; + LOGOS_ASSERT_EQ(module.generate_user_config(args), 0); + LOGOS_ASSERT(t.cFunctionCalled("generate_user_config")); +} + +LOGOS_TEST(generate_user_config_returns_1_on_failure) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + + t.mockCFunction("generate_user_config").returns(1); + + QVariantMap args; + LOGOS_ASSERT_EQ(module.generate_user_config(args), 1); +} + +LOGOS_TEST(generate_user_config_from_str_delegates_to_generate_user_config) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + + t.mockCFunction("generate_user_config").returns(0); + + LOGOS_ASSERT_EQ(module.generate_user_config_from_str(R"({"output":"/tmp/out.json"})"), 0); + LOGOS_ASSERT(t.cFunctionCalled("generate_user_config")); +} + +LOGOS_TEST(generate_user_config_with_all_fields) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + + t.mockCFunction("generate_user_config").returns(0); + + QVariantMap deployment; + deployment["well_known_deployment"] = "devnet"; + + QVariantMap args; + args["initial_peers"] = QStringList{"peer1", "peer2"}; + args["output"] = "/tmp/out.json"; + args["net_port"] = 9000; + args["blend_port"] = 9001; + args["http_addr"] = "0.0.0.0:8080"; + args["external_address"] = "1.2.3.4"; + args["no_public_ip_check"] = true; + args["deployment"] = deployment; + args["state_path"] = "/tmp/state"; + + LOGOS_ASSERT_EQ(module.generate_user_config(args), 0); +} + +// ============================================================================ +// No-node error paths — all methods should fail gracefully +// ============================================================================ + +LOGOS_TEST(stop_without_node_returns_1) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_EQ(module.stop(), 1); +} + +LOGOS_TEST(wallet_get_balance_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + QString result = module.wallet_get_balance(VALID_HEX); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("not running")); +} + +LOGOS_TEST(wallet_transfer_funds_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + QString result = module.wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, VALID_HEX, "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("not running")); +} + +LOGOS_TEST(wallet_transfer_funds_single_sender_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + QString result = module.wallet_transfer_funds(VALID_HEX, VALID_HEX, VALID_HEX, "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); +} + +LOGOS_TEST(wallet_get_known_addresses_without_node_returns_empty) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_TRUE(module.wallet_get_known_addresses().isEmpty()); +} + +LOGOS_TEST(blend_join_as_core_node_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + QString result = module.blend_join_as_core_node(VALID_HEX, VALID_HEX, VALID_HEX, {"locator1"}); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("not running")); +} + +LOGOS_TEST(get_block_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_TRUE(module.get_block(VALID_HEX).startsWith("Error:")); +} + +LOGOS_TEST(get_blocks_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_TRUE(module.get_blocks(0, 10).startsWith("Error:")); +} + +LOGOS_TEST(get_transaction_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_TRUE(module.get_transaction(VALID_HEX).startsWith("Error:")); +} + +LOGOS_TEST(get_cryptarchia_info_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_TRUE(module.get_cryptarchia_info().startsWith("Error:")); +} + +// ============================================================================ +// Node lifecycle (start / stop) +// ============================================================================ + +LOGOS_TEST(start_succeeds_with_mocked_dependencies) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + LOGOS_ASSERT_TRUE(tmpDir.isValid()); + + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + LOGOS_ASSERT(t.cFunctionCalled("start_lb_node")); + LOGOS_ASSERT(t.cFunctionCalled("subscribe_to_new_blocks")); + delete module; +} + +LOGOS_TEST(start_returns_1_when_already_running) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + LOGOS_ASSERT_EQ(module->start("/tmp/config.json", ""), 1); + delete module; +} + +LOGOS_TEST(start_returns_2_without_logos_api) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + LOGOS_ASSERT_EQ(module.start("/tmp/config.json", ""), 2); +} + +LOGOS_TEST(stop_succeeds_with_running_node) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + LOGOS_ASSERT_EQ(module->stop(), 0); + LOGOS_ASSERT(t.cFunctionCalled("stop_node")); + delete module; +} + +// ============================================================================ +// Input validation (requires running node) +// ============================================================================ + +// wallet_get_balance validation + +LOGOS_TEST(wallet_get_balance_rejects_short_hex) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_get_balance("abcd"); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("64 hex")); + delete module; +} + +LOGOS_TEST(wallet_get_balance_rejects_long_hex) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_get_balance(QString(66, 'a')); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + delete module; +} + +LOGOS_TEST(wallet_get_balance_rejects_invalid_chars) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString hex = QString(62, 'a') + "zz"; + QString result = module->wallet_get_balance(hex); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + delete module; +} + +// wallet_transfer_funds validation + +LOGOS_TEST(wallet_transfer_funds_rejects_invalid_amount) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, VALID_HEX, "not_a_number", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("Invalid amount")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_rejects_invalid_change_key) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_transfer_funds("bad", QStringList{VALID_HEX}, VALID_HEX, "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("change_public_key")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_rejects_invalid_recipient) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, "short", "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("recipient_address")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_rejects_empty_senders) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{}, VALID_HEX, "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("sender")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_rejects_invalid_sender_address) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{"bad_addr"}, VALID_HEX, "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("sender")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_rejects_invalid_optional_tip) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, VALID_HEX, "100", "bad_tip"); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("tip")); + delete module; +} + +// blend_join_as_core_node validation + +LOGOS_TEST(blend_join_rejects_invalid_provider_id) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->blend_join_as_core_node("short", VALID_HEX, VALID_HEX, {}); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("provider_id")); + delete module; +} + +LOGOS_TEST(blend_join_rejects_invalid_zk_id) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->blend_join_as_core_node(VALID_HEX, "short", VALID_HEX, {}); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("zk_id")); + delete module; +} + +LOGOS_TEST(blend_join_rejects_invalid_locked_note_id) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->blend_join_as_core_node(VALID_HEX, VALID_HEX, "short", {}); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("locked_note_id")); + delete module; +} + +// get_block / get_transaction validation + +LOGOS_TEST(get_block_rejects_invalid_hex) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->get_block("tooshort"); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("64 hex")); + delete module; +} + +LOGOS_TEST(get_transaction_rejects_invalid_hex) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + QString result = module->get_transaction("bad"); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("64 hex")); + delete module; +} + +// ============================================================================ +// 0x prefix handling +// ============================================================================ + +LOGOS_TEST(wallet_get_balance_accepts_0x_prefix) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_balance_value").returns(42); + t.mockCFunction("get_balance_error").returns(0); + + QString result = module->wallet_get_balance(VALID_HEX_WITH_PREFIX); + LOGOS_ASSERT_EQ(result, QString("42")); + delete module; +} + +// ============================================================================ +// Success paths (requires running node + mocked C functions) +// ============================================================================ + +// Wallet + +LOGOS_TEST(wallet_get_balance_returns_balance_string) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_balance_value").returns(1000); + t.mockCFunction("get_balance_error").returns(0); + + QString result = module->wallet_get_balance(VALID_HEX); + LOGOS_ASSERT_EQ(result, QString("1000")); + LOGOS_ASSERT(t.cFunctionCalled("get_balance")); + delete module; +} + +LOGOS_TEST(wallet_get_balance_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_balance_error").returns(1); + + QString result = module->wallet_get_balance(VALID_HEX); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_returns_tx_hash) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("transfer_funds_error").returns(0); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, VALID_HEX, "500", ""); + LOGOS_ASSERT_FALSE(result.startsWith("Error:")); + LOGOS_ASSERT_EQ(result.length(), 64); + LOGOS_ASSERT_TRUE(result.startsWith("ab")); + LOGOS_ASSERT(t.cFunctionCalled("transfer_funds")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_with_optional_tip) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("transfer_funds_error").returns(0); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, VALID_HEX, "100", VALID_HEX); + LOGOS_ASSERT_FALSE(result.startsWith("Error:")); + LOGOS_ASSERT_EQ(result.length(), 64); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("transfer_funds_error").returns(1); + + QString result = module->wallet_transfer_funds(VALID_HEX, QStringList{VALID_HEX}, VALID_HEX, "100", ""); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_single_sender_overload) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("transfer_funds_error").returns(0); + + QString result = module->wallet_transfer_funds(VALID_HEX, VALID_HEX, VALID_HEX, "100", ""); + LOGOS_ASSERT_FALSE(result.startsWith("Error:")); + LOGOS_ASSERT(t.cFunctionCalled("transfer_funds")); + delete module; +} + +LOGOS_TEST(wallet_transfer_funds_multiple_senders) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("transfer_funds_error").returns(0); + + QStringList senders; + senders << VALID_HEX << VALID_HEX_WITH_PREFIX.mid(2); // two different addresses + QString result = module->wallet_transfer_funds(VALID_HEX, senders, VALID_HEX, "200", ""); + LOGOS_ASSERT_FALSE(result.startsWith("Error:")); + delete module; +} + +LOGOS_TEST(wallet_get_known_addresses_returns_addresses) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_known_addresses_error").returns(0); + t.mockCFunction("get_known_addresses_count").returns(2); + + QStringList addrs = module->wallet_get_known_addresses(); + LOGOS_ASSERT_EQ(addrs.size(), 2); + // Mock fills addr0 with 0x11 → hex "1111...11", addr1 with 0x22 → "2222...22" + LOGOS_ASSERT_EQ(addrs[0], QString(64, '1')); + LOGOS_ASSERT_EQ(addrs[1], QString(64, '2')); + LOGOS_ASSERT(t.cFunctionCalled("get_known_addresses")); + LOGOS_ASSERT(t.cFunctionCalled("free_known_addresses")); + delete module; +} + +LOGOS_TEST(wallet_get_known_addresses_returns_empty_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_known_addresses_error").returns(1); + + QStringList addrs = module->wallet_get_known_addresses(); + LOGOS_ASSERT_TRUE(addrs.isEmpty()); + delete module; +} + +// Blend + +LOGOS_TEST(blend_join_as_core_node_returns_declaration_id) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("blend_join_as_core_node_error").returns(0); + + QStringList locators = {"locator1", "locator2"}; + QString result = module->blend_join_as_core_node(VALID_HEX, VALID_HEX, VALID_HEX, locators); + // Mock fills hash with 0xCD → hex "cdcd...cd" (64 chars) + LOGOS_ASSERT_EQ(result.length(), 64); + LOGOS_ASSERT_TRUE(result.startsWith("cd")); + LOGOS_ASSERT(t.cFunctionCalled("blend_join_as_core_node")); + delete module; +} + +LOGOS_TEST(blend_join_as_core_node_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("blend_join_as_core_node_error").returns(1); + + QString result = module->blend_join_as_core_node(VALID_HEX, VALID_HEX, VALID_HEX, {}); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + delete module; +} + +// Explorer + +LOGOS_TEST(get_block_returns_json_on_success) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_block").returns(R"({"slot":42,"data":"test"})"); + t.mockCFunction("get_block_error").returns(0); + + QString result = module->get_block(VALID_HEX); + LOGOS_ASSERT_TRUE(result.contains("slot")); + LOGOS_ASSERT_TRUE(result.contains("42")); + LOGOS_ASSERT(t.cFunctionCalled("get_block")); + LOGOS_ASSERT(t.cFunctionCalled("free_cstring")); + delete module; +} + +LOGOS_TEST(get_block_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_block_error").returns(1); + + QString result = module->get_block(VALID_HEX); + LOGOS_ASSERT_TRUE(result.startsWith("Error:")); + delete module; +} + +LOGOS_TEST(get_blocks_returns_json_on_success) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_blocks").returns(R"([{"slot":1},{"slot":2}])"); + t.mockCFunction("get_blocks_error").returns(0); + + QString result = module->get_blocks(1, 10); + LOGOS_ASSERT_TRUE(result.contains("slot")); + LOGOS_ASSERT(t.cFunctionCalled("get_blocks")); + delete module; +} + +LOGOS_TEST(get_blocks_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_blocks_error").returns(1); + + LOGOS_ASSERT_TRUE(module->get_blocks(0, 10).startsWith("Error:")); + delete module; +} + +LOGOS_TEST(get_transaction_returns_json_on_success) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_transaction").returns(R"({"hash":"abc","status":"confirmed"})"); + t.mockCFunction("get_transaction_error").returns(0); + + QString result = module->get_transaction(VALID_HEX); + LOGOS_ASSERT_TRUE(result.contains("confirmed")); + LOGOS_ASSERT(t.cFunctionCalled("get_transaction")); + LOGOS_ASSERT(t.cFunctionCalled("free_cstring")); + delete module; +} + +LOGOS_TEST(get_transaction_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_transaction_error").returns(1); + + LOGOS_ASSERT_TRUE(module->get_transaction(VALID_HEX).startsWith("Error:")); + delete module; +} + +// Cryptarchia + +LOGOS_TEST(get_cryptarchia_info_returns_json_on_success) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_cryptarchia_info_error").returns(0); + t.mockCFunction("cryptarchia_slot").returns(100); + t.mockCFunction("cryptarchia_height").returns(50); + t.mockCFunction("cryptarchia_mode").returns(1); // Online + + QString result = module->get_cryptarchia_info(); + LOGOS_ASSERT_FALSE(result.startsWith("Error:")); + LOGOS_ASSERT_TRUE(result.contains("slot")); + LOGOS_ASSERT_TRUE(result.contains("100")); + LOGOS_ASSERT_TRUE(result.contains("height")); + LOGOS_ASSERT_TRUE(result.contains("50")); + LOGOS_ASSERT_TRUE(result.contains("Online")); + LOGOS_ASSERT_TRUE(result.contains("lib")); + LOGOS_ASSERT_TRUE(result.contains("tip")); + LOGOS_ASSERT(t.cFunctionCalled("get_cryptarchia_info")); + LOGOS_ASSERT(t.cFunctionCalled("free_cryptarchia_info")); + delete module; +} + +LOGOS_TEST(get_cryptarchia_info_bootstrapping_mode) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_cryptarchia_info_error").returns(0); + t.mockCFunction("cryptarchia_mode").returns(0); // Bootstrapping + + QString result = module->get_cryptarchia_info(); + LOGOS_ASSERT_TRUE(result.contains("Bootstrapping")); + delete module; +} + +LOGOS_TEST(get_cryptarchia_info_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + QTemporaryDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_cryptarchia_info_error").returns(1); + + LOGOS_ASSERT_TRUE(module->get_cryptarchia_info().startsWith("Error:")); + delete module; +}