From 93e4c388801dcf2fdaeb505861a29f22d7470b35 Mon Sep 17 00:00:00 2001 From: Khushboo Mehta Date: Thu, 16 Apr 2026 22:57:41 +0200 Subject: [PATCH] feat: user new module builder and new qml app -> qml + c++ backend --- CMakeLists.txt | 236 +- README.md | 154 +- app/CMakeLists.txt | 62 - app/main.cpp | 56 - app/mainwindow.cpp | 66 - app/mainwindow.h | 18 - flake.lock | 3854 ++++++++++++++++++++++---- flake.nix | 106 +- interfaces/IComponent.h | 17 - metadata.json | 41 +- nix/app.nix | 216 -- nix/default.nix | 41 - nix/lib.nix | 51 - src/BlockchainBackend.cpp | 345 +-- src/BlockchainBackend.h | 122 +- src/BlockchainBackend.rep | 19 + src/BlockchainPlugin.cpp | 59 +- src/BlockchainPlugin.h | 38 +- src/BlockchainPluginInterface.h | 19 + src/blockchain_resources.qrc | 18 - src/qml/BlockchainView.qml | 240 +- src/qml/controls/AccountDelegate.qml | 2 +- src/qml/controls/LogosCopyButton.qml | 8 +- src/{ => qml}/icons/checkmark.svg | 0 src/{ => qml}/icons/copy.svg | 0 src/{ => qml}/icons/refresh.svg | 0 src/qml/views/ConfigChoiceView.qml | 18 +- src/qml/views/GenerateConfigView.qml | 2 +- src/qml/views/LogsView.qml | 21 +- src/qml/views/SetConfigPathView.qml | 4 +- 30 files changed, 3950 insertions(+), 1883 deletions(-) delete mode 100644 app/CMakeLists.txt delete mode 100644 app/main.cpp delete mode 100644 app/mainwindow.cpp delete mode 100644 app/mainwindow.h delete mode 100644 interfaces/IComponent.h delete mode 100644 nix/app.nix delete mode 100644 nix/default.nix delete mode 100644 nix/lib.nix create mode 100644 src/BlockchainBackend.rep create mode 100644 src/BlockchainPluginInterface.h delete mode 100644 src/blockchain_resources.qrc rename src/{ => qml}/icons/checkmark.svg (100%) rename src/{ => qml}/icons/copy.svg (100%) rename src/{ => qml}/icons/refresh.svg (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 773dc69..60e6b42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,219 +1,27 @@ -cmake_minimum_required(VERSION 3.16) -project(BlockchainUIPlugin VERSION 1.0.0 LANGUAGES CXX) +cmake_minimum_required(VERSION 3.14) +project(BlockchainUiPlugin LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -set(CMAKE_AUTOUIC ON) - -# Allow override from environment or command line -if(NOT DEFINED LOGOS_LIBLOGOS_ROOT) - set(_parent_liblogos "${CMAKE_SOURCE_DIR}/../logos-liblogos") - set(_use_vendor ${LOGOS_BLOCKCHAIN_UI_USE_VENDOR}) - if(NOT _use_vendor) - if(NOT EXISTS "${_parent_liblogos}/interface.h") - set(_use_vendor ON) - endif() - endif() - if(_use_vendor) - set(LOGOS_LIBLOGOS_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-liblogos") - else() - set(LOGOS_LIBLOGOS_ROOT "${_parent_liblogos}") - endif() -endif() - -if(NOT DEFINED LOGOS_CPP_SDK_ROOT) - set(_parent_cpp_sdk "${CMAKE_SOURCE_DIR}/../logos-cpp-sdk") - set(_use_vendor ${LOGOS_BLOCKCHAIN_UI_USE_VENDOR}) - if(NOT _use_vendor) - if(NOT EXISTS "${_parent_cpp_sdk}/cpp/logos_api.h") - set(_use_vendor ON) - endif() - endif() - if(_use_vendor) - set(LOGOS_CPP_SDK_ROOT "${CMAKE_SOURCE_DIR}/vendor/logos-cpp-sdk") - else() - set(LOGOS_CPP_SDK_ROOT "${_parent_cpp_sdk}") - endif() -endif() - -# Check if dependencies are available (support both source and installed layouts) -set(_liblogos_found FALSE) -if(EXISTS "${LOGOS_LIBLOGOS_ROOT}/interface.h") - set(_liblogos_found TRUE) - set(_liblogos_is_source TRUE) -elseif(EXISTS "${LOGOS_LIBLOGOS_ROOT}/include/interface.h") - set(_liblogos_found TRUE) - set(_liblogos_is_source FALSE) -endif() - -set(_cpp_sdk_found FALSE) -if(EXISTS "${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h") - set(_cpp_sdk_found TRUE) - set(_cpp_sdk_is_source TRUE) -elseif(EXISTS "${LOGOS_CPP_SDK_ROOT}/include/cpp/logos_api.h") - set(_cpp_sdk_found TRUE) - set(_cpp_sdk_is_source FALSE) -endif() - -if(NOT _liblogos_found) - message(FATAL_ERROR "logos-liblogos not found at ${LOGOS_LIBLOGOS_ROOT}. " - "Set LOGOS_LIBLOGOS_ROOT or run git submodule update --init --recursive.") -endif() - -if(NOT _cpp_sdk_found) - message(FATAL_ERROR "logos-cpp-sdk not found at ${LOGOS_CPP_SDK_ROOT}. " - "Set LOGOS_CPP_SDK_ROOT or run git submodule update --init --recursive.") -endif() - -# Find Qt packages -find_package(Qt6 REQUIRED COMPONENTS Core Widgets RemoteObjects Quick QuickWidgets) - -# Try to find the component-interfaces package first -find_package(component-interfaces QUIET) - -# If not found, use the local interfaces folder -if(NOT component-interfaces_FOUND) - # Include the local interfaces directory - include_directories(${CMAKE_CURRENT_SOURCE_DIR}/interfaces) - - # Create a component-interfaces library - add_library(component-interfaces INTERFACE) - target_include_directories(component-interfaces INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/interfaces) -endif() - -# Source files -set(SOURCES - src/AccountsModel.cpp - src/AccountsModel.h - src/BlockchainPlugin.cpp - src/BlockchainPlugin.h - src/BlockchainBackend.cpp - src/BlockchainBackend.h - src/LogModel.cpp - src/LogModel.h - src/blockchain_resources.qrc -) - -# Add SDK sources (only if source layout, installed layout uses the library) -if(_cpp_sdk_is_source) - list(APPEND SOURCES - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api.h - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_client.h - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_consumer.h - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/logos_api_provider.h - ${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/token_manager.h - ${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.cpp - ${LOGOS_CPP_SDK_ROOT}/cpp/module_proxy.h - ) -endif() - -# Create the plugin library -add_library(blockchain_ui SHARED ${SOURCES}) - -# Set output name without lib prefix -set_target_properties(blockchain_ui PROPERTIES - PREFIX "" - OUTPUT_NAME "blockchain_ui" -) - -# Include directories -target_include_directories(blockchain_ui PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/src - ${CMAKE_CURRENT_BINARY_DIR} -) - -# Add include directories based on layout type -if(_liblogos_is_source) - target_include_directories(blockchain_ui PRIVATE ${LOGOS_LIBLOGOS_ROOT}) +if(DEFINED ENV{LOGOS_MODULE_BUILDER_ROOT}) + include($ENV{LOGOS_MODULE_BUILDER_ROOT}/cmake/LogosModule.cmake) else() - target_include_directories(blockchain_ui PRIVATE ${LOGOS_LIBLOGOS_ROOT}/include) + message(FATAL_ERROR "LogosModule.cmake not found. Set LOGOS_MODULE_BUILDER_ROOT.") endif() -if(_cpp_sdk_is_source) - target_include_directories(blockchain_ui PRIVATE - ${LOGOS_CPP_SDK_ROOT}/cpp - ) -else() - target_include_directories(blockchain_ui PRIVATE - ${LOGOS_CPP_SDK_ROOT}/include - ${LOGOS_CPP_SDK_ROOT}/include/cpp - ${LOGOS_CPP_SDK_ROOT}/include/core - ) -endif() - -# Link against libraries -target_link_libraries(blockchain_ui PRIVATE - Qt6::Core - Qt6::Widgets - Qt6::RemoteObjects - Qt6::Quick - Qt6::QuickWidgets - component-interfaces +logos_module( + NAME blockchain_ui + REP_FILE src/BlockchainBackend.rep + SOURCES + src/BlockchainPluginInterface.h + src/BlockchainPlugin.h + src/BlockchainPlugin.cpp + src/BlockchainBackend.h + src/BlockchainBackend.cpp + src/AccountsModel.h + src/AccountsModel.cpp + src/LogModel.h + src/LogModel.cpp + FIND_PACKAGES + Qt6Gui + LINK_LIBRARIES + Qt6::Gui ) - -# When using installed SDK layout (e.g. Nix), link the pre-built SDK library -if(NOT _cpp_sdk_is_source) - find_library(LOGOS_SDK_LIB logos_sdk PATHS ${LOGOS_CPP_SDK_ROOT}/lib NO_DEFAULT_PATH) - if(LOGOS_SDK_LIB) - target_link_libraries(blockchain_ui PRIVATE ${LOGOS_SDK_LIB}) - else() - message(FATAL_ERROR "logos_sdk library not found in ${LOGOS_CPP_SDK_ROOT}/lib - required when using installed SDK layout") - endif() -endif() - -# Link against Abseil libraries if found -find_package(absl QUIET) -if(absl_FOUND) - target_link_libraries(blockchain_ui PRIVATE - absl::base - absl::strings - absl::log - absl::check - ) -endif() - -# Set common properties for both platforms -set_target_properties(blockchain_ui PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/modules" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/modules" # For Windows .dll - BUILD_WITH_INSTALL_RPATH TRUE - SKIP_BUILD_RPATH FALSE) - -if(APPLE) - # macOS specific settings - set_target_properties(blockchain_ui PROPERTIES - INSTALL_RPATH "@loader_path" - INSTALL_NAME_DIR "@rpath" - BUILD_WITH_INSTALL_NAME_DIR TRUE) - - add_custom_command(TARGET blockchain_ui POST_BUILD - COMMAND install_name_tool -id "@rpath/blockchain_ui.dylib" $ - COMMENT "Updating library paths for macOS" - ) -else() - # Linux specific settings - set_target_properties(blockchain_ui PROPERTIES - INSTALL_RPATH "$ORIGIN" - INSTALL_RPATH_USE_LINK_PATH FALSE) -endif() - -install(TARGETS blockchain_ui - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules - RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/logos/modules -) - -install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/metadata.json - DESTINATION ${CMAKE_INSTALL_DATADIR}/logos-blockchain-ui -) - -# Print status messages -message(STATUS "Blockchain UI Plugin configured successfully") diff --git a/README.md b/README.md index c112235..6b4dbf2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # logos-blockchain-ui -A Qt UI plugin for the Logos Blockchain Module, providing a graphical interface to control and monitor the Logos blockchain node. +A QML + C++ backend UI module for the [Logos](https://logos.co) platform that provides a graphical interface to control and monitor the Logos blockchain node. + +Built with [`logos-module-builder`](https://github.com/logos-co/logos-module-builder) using the `mkLogosQmlModule` pattern (QML frontend + C++ backend with Qt Remote Objects). ## Features @@ -8,139 +10,119 @@ A Qt UI plugin for the Logos Blockchain Module, providing a graphical interface - Configure node parameters (config path, deployment) - Check wallet balances - Monitor node status and information +- Account management ## Standalone App Quickstart -1. Build and run the app with +1. Build and run the app: ```bash -nix run '.#app' +nix run ``` -2. Generate a new config using the some initial peers that are part of the live testnet. You can find some peers [here](https://www.notion.so/nomos-tech/Logos-Blockchain-Devnet-Lisbon-March-2026-2fe261aa09df8025ad94e380933b4cf9?source=copy_link#319261aa09df80a6ac9bcb7487d14d6a). +2. Generate a new config using initial peers from the live testnet. Find peers [here](https://www.notion.so/nomos-tech/Logos-Blockchain-Devnet-Lisbon-March-2026-2fe261aa09df8025ad94e380933b4cf9?source=copy_link#319261aa09df80a6ac9bcb7487d14d6a). -3. Start the node, and let it sync with the initial peers. You can track progress by opening a terminal and running: +3. Start the node and let it sync. Track progress: ```bash watch -n1 'curl -s localhost:8080/cryptarchia/info' ``` -And comparing the `height` with the block height in the [block explorer](https://devnet.blockchain.logos.co/web/explorer/). +Compare the `height` with the [block explorer](https://devnet.blockchain.logos.co/web/explorer/). -4. In the meantime, you can request funds from the faucet, copy one of the keys visible in the ui and paste it into the [faucet](https://devnet.blockchain.logos.co/web/faucet/). +4. Request funds from the [faucet](https://devnet.blockchain.logos.co/web/faucet/) — copy one of the keys from the UI and paste it there. -5. Once your node finishes syncing, you can refresh your balance and you should see your funds from the faucet. +5. Once synced, refresh your balance to see your funds. -At this point, you are done. If you leave this node running, your tokens will age sufficiently such that they will become eligible for participation in consensus. This happens automatically, so long as you don't transfer your tokens for ~3.5 hours. +Leaving the node running for ~3.5 hours allows your tokens to age and become eligible for consensus participation (automatic). -For a video walkthrough of this process, see this [recording](https://drive.google.com/file/d/1hw6rQZnuka3Y_JBpUz0WyLXglTSPiZEc/view?usp=drive_link). +For a video walkthrough, see this [recording](https://drive.google.com/file/d/1hw6rQZnuka3Y_JBpUz0WyLXglTSPiZEc/view?usp=drive_link). -## How to Build +## How to Run -### Using Nix (Recommended) - -#### Build Complete UI Plugin +### Standalone (recommended for development) ```bash -# Build everything (default) -nix build +# Run directly +nix run -# Or explicitly -nix build '.#default' +# With local workspace overrides +nix run --override-input liblogos_blockchain_module path:../logos-blockchain-module \ + --override-input liblogos_blockchain_module/logos-module-builder path:../logos-module-builder ``` -The result will include: -- `/lib/blockchain_ui.dylib` (or `.so` on Linux) - The Blockchain UI plugin - -#### Build Individual Components +### In Basecamp ```bash -# Build only the library (plugin) -nix build '.#lib' +# Build LGX +nix build .#lgx -# Build the standalone Qt application -nix build '.#app' +# Install into Basecamp's plugin directory +lgpm --ui-plugins-dir ~/Library/Application\ Support/Logos/LogosBasecampDev/plugins \ + install --file result/*.lgx ``` -#### Development Shell +Or from the workspace: ```bash -# Enter development shell with all dependencies -nix develop +ws bundle logos-blockchain-ui --auto-local ``` -**Note:** In zsh, you need to quote the target (e.g., `'.#default'`) to prevent glob expansion. - -If you don't have flakes enabled globally, add experimental flags: +### Build Targets ```bash -nix build --extra-experimental-features 'nix-command flakes' +nix build # default — combined plugin + QML output +nix build .#lgx # .lgx package for distribution +nix build .#install # lgpm-installed output (modules/ + plugins/) +nix run # standalone app with blockchain module +nix develop # enter development shell ``` -The compiled artifacts can be found at `result/` +## Module Structure -#### Running the Standalone App - -After building the app with `nix build '.#app'`, you can run it: - -```bash -# Run the standalone Qt application -./result/bin/logos-blockchain-ui-app ``` - -The app will automatically load the required modules (capability_module, liblogos_blockchain_module) and the blockchain_ui Qt plugin. All dependencies are bundled in the Nix store layout. - -#### Nix Organization - -The nix build system is organized into modular files in the `/nix` directory: -- `nix/default.nix` - Common configuration (dependencies, flags, metadata) -- `nix/lib.nix` - UI plugin compilation -- `nix/app.nix` - Standalone Qt application compilation - -## Output Structure - -When built with Nix: - -**Library build (`nix build '.#lib'`):** -``` -result/ -└── lib/ - └── blockchain_ui.dylib # Logos Blockchain UI plugin -``` - -**App build (`nix build '.#app'`):** -``` -result/ -├── bin/ -│ ├── logos-blockchain-ui-app # Standalone Qt application -│ ├── logos_host # Logos host executable (for plugins) -│ └── logoscore # Logos core executable -├── lib/ -│ ├── liblogos_core.dylib # Logos core library -│ ├── liblogos_sdk.dylib # Logos SDK library -│ └── Logos/DesignSystem/ # QML design system -├── modules/ -│ ├── capability_module_plugin.dylib -│ ├── liblogos_blockchain_module.dylib -│ └── liblogos_blockchain.dylib -└── blockchain_ui.dylib # Qt plugin (loaded by app) +logos-blockchain-ui/ +├── flake.nix # mkLogosQmlModule +├── metadata.json # Module config (ui_qml type) +├── CMakeLists.txt # logos_module() macro +└── src/ + ├── BlockchainBackend.rep # RemoteObject interface + ├── BlockchainBackend.h/cpp # Business logic (extends BlockchainBackendSimpleSource) + ├── BlockchainPlugin.h/cpp # Thin plugin entry point + ├── BlockchainPluginInterface.h # Plugin interface marker + ├── AccountsModel.h/cpp # QAbstractListModel for accounts + ├── LogModel.h/cpp # QAbstractListModel for logs + └── qml/ + └── BlockchainView.qml # QML frontend (+ sub-views) ``` ## Configuration ### Blockchain Node Configuration -The blockchain node can be configured in two ways: - -1. **Via UI**: Enter the config path in the "Config Path" field -2. **Via Environment Variable**: Set `LB_CONFIG_PATH` to your configuration file path - -Example configuration file can be found in the logos-blockchain-module repository at `config/node_config.yaml`. +- **Via UI**: Enter the config path in the "Config Path" field +- **Via Environment Variable**: Set `LB_CONFIG_PATH` to your configuration file path ### QML Hot Reload -During development, you can enable QML hot reload by setting an environment variable: +During development, set the environment variable to load QML from disk: + ```bash export BLOCKCHAIN_UI_QML_PATH=/path/to/logos-blockchain-ui/src/qml ``` -This allows you to edit the QML file and see changes by reloading the plugin without recompiling. + +## Dependencies + +| Dependency | Purpose | +|---|---| +| Qt6 Core, Gui, RemoteObjects, Declarative | UI framework + IPC | +| [`logos-module-builder`](https://github.com/logos-co/logos-module-builder) | Build system (mkLogosQmlModule) | +| [`logos-blockchain-module`](https://github.com/logos-blockchain/logos-blockchain-module) | Blockchain backend module | + +## Related Repositories + +| Repository | Role | +|---|---| +| [`logos-blockchain-module`](https://github.com/logos-blockchain/logos-blockchain-module) | Blockchain backend — this UI's required dependency | +| [`logos-module-builder`](https://github.com/logos-co/logos-module-builder) | Module build system | +| [`logos-liblogos`](https://github.com/logos-co/logos-liblogos) | Logos Core platform | diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt deleted file mode 100644 index 494d131..0000000 --- a/app/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(LogosBlockchainUIApp LANGUAGES CXX) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_AUTOMOC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -# Find Qt packages -find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Widgets) -find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets) - -# Find logos-liblogos -if(NOT DEFINED LOGOS_LIBLOGOS_ROOT) - message(FATAL_ERROR "LOGOS_LIBLOGOS_ROOT must be defined") -endif() - -message(STATUS "Using logos-liblogos at: ${LOGOS_LIBLOGOS_ROOT}") - -# Include and link directories (app only uses logos_core from liblogos, not the SDK) -include_directories( - ${LOGOS_LIBLOGOS_ROOT}/include -) - -link_directories( - ${LOGOS_LIBLOGOS_ROOT}/lib -) - -# Set output directories -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) - -# Create the executable -add_executable(logos-blockchain-ui-app - main.cpp - mainwindow.cpp - mainwindow.h -) - -# Link libraries -target_link_libraries(logos-blockchain-ui-app PRIVATE - Qt${QT_VERSION_MAJOR}::Core - Qt${QT_VERSION_MAJOR}::Widgets - logos_core -) - -# Set RPATH settings for the executable -if(APPLE) - set_target_properties(logos-blockchain-ui-app PROPERTIES - INSTALL_RPATH "@executable_path/../lib" - BUILD_WITH_INSTALL_RPATH TRUE - ) -elseif(UNIX) - set_target_properties(logos-blockchain-ui-app PROPERTIES - INSTALL_RPATH "$ORIGIN/../lib" - BUILD_WITH_INSTALL_RPATH TRUE - ) -endif() - -# Install rules -install(TARGETS logos-blockchain-ui-app - RUNTIME DESTINATION bin -) diff --git a/app/main.cpp b/app/main.cpp deleted file mode 100644 index 6c0ba25..0000000 --- a/app/main.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "mainwindow.h" - -#include -#include -#include -#include -#include - -// CoreManager C API functions -extern "C" { - void logos_core_set_plugins_dir(const char* plugins_dir); - void logos_core_start(); - void logos_core_cleanup(); - char** logos_core_get_loaded_plugins(); - int logos_core_load_plugin(const char* plugin_name); -} - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - QString pluginsDir = QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../modules"); - logos_core_set_plugins_dir(pluginsDir.toUtf8().constData()); - - logos_core_start(); - - if (!logos_core_load_plugin("capability_module")) { - qWarning() << "Failed to load capability_module plugin"; - } - - if (!logos_core_load_plugin("liblogos_blockchain_module")) { - qWarning() << "Failed to load blockchain module plugin"; - } - - char** loadedPlugins = logos_core_get_loaded_plugins(); - int count = 0; - if (loadedPlugins) { - qInfo() << "Currently loaded plugins:"; - for (char** p = loadedPlugins; *p != nullptr; ++p) { - qInfo() << " -" << *p; - ++count; - } - qInfo() << "Total plugins:" << count; - } else { - qInfo() << "No plugins loaded."; - } - - MainWindow window; - window.show(); - - int result = app.exec(); - - logos_core_cleanup(); - - return result; -} diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp deleted file mode 100644 index b749dce..0000000 --- a/app/mainwindow.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include "mainwindow.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) -{ - setupUi(); -} - -MainWindow::~MainWindow() -{ -} - -void MainWindow::setupUi() -{ - // Determine the appropriate plugin extension based on the platform - QString pluginExtension; - #if defined(Q_OS_WIN) - pluginExtension = ".dll"; - #elif defined(Q_OS_MAC) - pluginExtension = ".dylib"; - #else // Linux and other Unix-like systems - pluginExtension = ".so"; - #endif - - QString pluginPath = QCoreApplication::applicationDirPath() + "/../blockchain_ui" + pluginExtension; - QPluginLoader loader(pluginPath); - - QWidget* blockchainWidget = nullptr; - - if (loader.load()) { - QObject* plugin = loader.instance(); - if (plugin) { - // Try to create the blockchain widget using the plugin's createWidget method - QMetaObject::invokeMethod(plugin, "createWidget", - Qt::DirectConnection, - Q_RETURN_ARG(QWidget*, blockchainWidget)); - } - } - - if (blockchainWidget) { - setCentralWidget(blockchainWidget); - } else { - qWarning() << "================================================"; - qWarning() << "Failed to load blockchain UI plugin from:" << pluginPath; - qWarning() << "Error:" << loader.errorString(); - qWarning() << "================================================"; - - // Fallback: show a message when plugin is not found - QWidget* fallbackWidget = new QWidget(this); - QVBoxLayout* layout = new QVBoxLayout(fallbackWidget); - - QLabel* messageLabel = new QLabel("Blockchain UI module not loaded", fallbackWidget); - QFont font = messageLabel->font(); - font.setPointSize(14); - messageLabel->setFont(font); - messageLabel->setAlignment(Qt::AlignCenter); - - layout->addWidget(messageLabel); - setCentralWidget(fallbackWidget); - } - - // Set window title and size - setWindowTitle("Logos Blockchain UI App"); - resize(800, 600); -} diff --git a/app/mainwindow.h b/app/mainwindow.h deleted file mode 100644 index c90ddc9..0000000 --- a/app/mainwindow.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include - -class MainWindow : public QMainWindow -{ - Q_OBJECT - -public: - MainWindow(QWidget *parent = nullptr); - ~MainWindow(); - -private: - void setupUi(); -}; - -#endif // MAINWINDOW_H diff --git a/flake.lock b/flake.lock index 2017971..0c47a03 100644 --- a/flake.lock +++ b/flake.lock @@ -15,6 +15,32 @@ "type": "github" } }, + "liblogos_blockchain_module": { + "inputs": { + "logos-blockchain": "logos-blockchain", + "logos-core": "logos-core", + "logos-liblogos": "logos-liblogos", + "logos-module-viewer": "logos-module-viewer", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775208008, + "narHash": "sha256-64W2mRx7zGorHSUw6QmBcVRm/YErEgpKEuwNf0ouJjo=", + "owner": "logos-blockchain", + "repo": "logos-blockchain-module", + "rev": "a574eb61bfcf102fdf3fce74820735abde40fc1a", + "type": "github" + }, + "original": { + "owner": "logos-blockchain", + "repo": "logos-blockchain-module", + "type": "github" + } + }, "logos-blockchain": { "inputs": { "crane": "crane", @@ -55,50 +81,25 @@ "type": "github" } }, - "logos-blockchain-module": { - "inputs": { - "logos-blockchain": "logos-blockchain", - "logos-core": "logos-core", - "logos-liblogos": "logos-liblogos", - "logos-module-viewer": "logos-module-viewer", - "nixpkgs": [ - "logos-blockchain-module", - "logos-liblogos", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1772554989, - "narHash": "sha256-K29nawZnnqVPR3yANX3XRRzvwcDqaIjLMrG67tun+C8=", - "owner": "logos-blockchain", - "repo": "logos-blockchain-module", - "rev": "8fc7fb6d04ea273f7d213b7b2a60c637df470b39", - "type": "github" - }, - "original": { - "owner": "logos-blockchain", - "repo": "logos-blockchain-module", - "type": "github" - } - }, "logos-capability-module": { "inputs": { "logos-cpp-sdk": "logos-cpp-sdk", - "logos-liblogos": "logos-liblogos_2", + "logos-module": "logos-module", + "logos-nix": "logos-nix_4", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-liblogos", "logos-capability-module", - "logos-liblogos", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1767809111, - "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "lastModified": 1774455138, + "narHash": "sha256-szx2dnnY9MP1NpdBnR8E2DRSz9CtQlo/6698zgJcAEM=", "owner": "logos-co", "repo": "logos-capability-module", - "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "rev": "0655be68e0078bede0682bb6a5b53330dac37a72", "type": "github" }, "original": { @@ -109,10 +110,10 @@ }, "logos-capability-module_2": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_5", - "logos-liblogos": "logos-liblogos_3", + "logos-cpp-sdk": "logos-cpp-sdk_3", + "logos-liblogos": "logos-liblogos_2", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-module-viewer", "logos-capability-module", "logos-liblogos", @@ -135,10 +136,10 @@ }, "logos-capability-module_3": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_8", - "logos-liblogos": "logos-liblogos_5", + "logos-cpp-sdk": "logos-cpp-sdk_6", + "logos-liblogos": "logos-liblogos_4", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-module-viewer", "logos-liblogos", "logos-capability-module", @@ -147,11 +148,11 @@ ] }, "locked": { - "lastModified": 1767809111, - "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "lastModified": 1773696504, + "narHash": "sha256-wBn8onAkEvtvl1McLVyFDSB8BRhUrwJAnnYIfXnIhdI=", "owner": "logos-co", "repo": "logos-capability-module", - "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "rev": "2ee07fea9d0b9aca89dc215ee8b3be222017d706", "type": "github" }, "original": { @@ -162,20 +163,26 @@ }, "logos-capability-module_4": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_14", - "logos-liblogos": "logos-liblogos_7", + "logos-cpp-sdk": [ + "logos-module-builder", + "logos-standalone-app", + "logos-cpp-sdk" + ], + "logos-module": "logos-module_7", + "logos-nix": "logos-nix_22", "nixpkgs": [ - "logos-capability-module", - "logos-liblogos", + "logos-module-builder", + "logos-standalone-app", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1767809111, - "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "lastModified": 1774455138, + "narHash": "sha256-szx2dnnY9MP1NpdBnR8E2DRSz9CtQlo/6698zgJcAEM=", "owner": "logos-co", "repo": "logos-capability-module", - "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "rev": "0655be68e0078bede0682bb6a5b53330dac37a72", "type": "github" }, "original": { @@ -186,21 +193,24 @@ }, "logos-capability-module_5": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_17", - "logos-liblogos": "logos-liblogos_9", + "logos-cpp-sdk": "logos-cpp-sdk_14", + "logos-module": "logos-module_8", + "logos-nix": "logos-nix_27", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", "logos-liblogos", "logos-capability-module", - "logos-liblogos", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1767809111, - "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "lastModified": 1774455138, + "narHash": "sha256-szx2dnnY9MP1NpdBnR8E2DRSz9CtQlo/6698zgJcAEM=", "owner": "logos-co", "repo": "logos-capability-module", - "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "rev": "0655be68e0078bede0682bb6a5b53330dac37a72", "type": "github" }, "original": { @@ -211,14 +221,20 @@ }, "logos-core": { "inputs": { - "nixpkgs": "nixpkgs_3" + "logos-nix": "logos-nix", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-core", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1772028960, - "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", + "lastModified": 1774988975, + "narHash": "sha256-wJ7Bv3TL754bZcTL2qilI0JahiVag7fLDzw8Y6Qz0pk=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "95f763b48d74bcdc63093b05159f43500cab139e", + "rev": "d633575677a3d19a8bf1d5ff687398dace532938", "type": "github" }, "original": { @@ -229,14 +245,22 @@ }, "logos-cpp-sdk": { "inputs": { - "nixpkgs": "nixpkgs_4" + "logos-nix": "logos-nix_2", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "logos-capability-module", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1761230734, - "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "lastModified": 1773956385, + "narHash": "sha256-CV0Lo1FrosBt/MSP+GWQGWXnYobxRGXGOREylNuwZ58=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "rev": "4b66dac015e4b977d33cfae80a4c8e1d518679f3", "type": "github" }, "original": { @@ -246,168 +270,6 @@ } }, "logos-cpp-sdk_10": { - "inputs": { - "nixpkgs": "nixpkgs_15" - }, - "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_16" - }, - "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_12": { - "inputs": { - "nixpkgs": "nixpkgs_17" - }, - "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_13": { - "inputs": { - "nixpkgs": "nixpkgs_18" - }, - "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_14": { - "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_15": { - "inputs": { - "nixpkgs": "nixpkgs_21" - }, - "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_16": { - "inputs": { - "nixpkgs": "nixpkgs_22" - }, - "locked": { - "lastModified": 1772028960, - "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "95f763b48d74bcdc63093b05159f43500cab139e", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_17": { - "inputs": { - "nixpkgs": "nixpkgs_23" - }, - "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_18": { - "inputs": { - "nixpkgs": "nixpkgs_24" - }, - "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_19": { "inputs": { "nixpkgs": "nixpkgs_25" }, @@ -425,16 +287,16 @@ "type": "github" } }, - "logos-cpp-sdk_2": { + "logos-cpp-sdk_11": { "inputs": { - "nixpkgs": "nixpkgs_5" + "nixpkgs": "nixpkgs_26" }, "locked": { - "lastModified": 1761230734, - "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "lastModified": 1764699992, + "narHash": "sha256-nCmK9C9F31cHvy6lWKR5WGl99aJbS3kIsROAoZ4OrwI=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "rev": "5d0bbd0d1e00aad0532ffa7c8bf2c80f460a4f6d", "type": "github" }, "original": { @@ -443,16 +305,125 @@ "type": "github" } }, - "logos-cpp-sdk_20": { + "logos-cpp-sdk_12": { "inputs": { - "nixpkgs": "nixpkgs_26" + "logos-nix": "logos-nix_14", + "nixpkgs": [ + "logos-module-builder", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1767724329, - "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", + "lastModified": 1776101366, + "narHash": "sha256-HxkzOs2xv0grkNAJMBLXKDjVl8Z+z3YFn+sC4eFKy/8=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", + "rev": "1468180b2567f4c59346bb94f74951e76341f5c5", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_13": { + "inputs": { + "logos-nix": "logos-nix_23", + "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_14": { + "inputs": { + "logos-nix": "logos-nix_25", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "logos-capability-module", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773956385, + "narHash": "sha256-CV0Lo1FrosBt/MSP+GWQGWXnYobxRGXGOREylNuwZ58=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b66dac015e4b977d33cfae80a4c8e1d518679f3", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_15": { + "inputs": { + "logos-nix": "logos-nix_28", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775745471, + "narHash": "sha256-Flz0Ipok57ivbqg7Fw4qRcfCL3ainrRTXMIlNDh3ajY=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "8b1cfadf090f0df9d75e61ac7475d83f9c58b0a9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_2": { + "inputs": { + "logos-nix": "logos-nix_5", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "logos-cpp-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774958555, + "narHash": "sha256-9FMXR+YesH0JnR3DBv3BG1jtdTDWkPwMx+kIhuBpxZ4=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "38006e72400ee96a9d75e8feb102b474f80d3da5", "type": "github" }, "original": { @@ -463,14 +434,14 @@ }, "logos-cpp-sdk_3": { "inputs": { - "nixpkgs": "nixpkgs_6" + "nixpkgs": "nixpkgs_16" }, "locked": { - "lastModified": 1772028960, - "narHash": "sha256-BDWFjaKeoJW8oWDlPphNINt5U3P1xt1z1Y4f9jyC7uU=", + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "95f763b48d74bcdc63093b05159f43500cab139e", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", "type": "github" }, "original": { @@ -481,7 +452,97 @@ }, "logos-cpp-sdk_4": { "inputs": { - "nixpkgs": "nixpkgs_7" + "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, @@ -497,108 +558,23 @@ "type": "github" } }, - "logos-cpp-sdk_5": { - "inputs": { - "nixpkgs": "nixpkgs_10" - }, - "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_6": { - "inputs": { - "nixpkgs": "nixpkgs_11" - }, - "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_7": { - "inputs": { - "nixpkgs": "nixpkgs_12" - }, - "locked": { - "lastModified": 1770132997, - "narHash": "sha256-Iv0QMXMD6kf+y2Qx37jXR7Ik6h1dqOzuxBzCdc5S6KA=", - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "rev": "30ef7986f4b65b7dcf43af84bb073233b1b77821", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-cpp-sdk", - "type": "github" - } - }, - "logos-cpp-sdk_8": { - "inputs": { - "nixpkgs": "nixpkgs_13" - }, - "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_9": { - "inputs": { - "nixpkgs": "nixpkgs_14" - }, - "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-design-system": { "inputs": { + "logos-nix": "logos-nix_24", "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-design-system", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1772213764, - "narHash": "sha256-bI0fb9t+q5OUCYN+gWF7GDI/0u+DFFsCAImQF61U0DA=", + "lastModified": 1774455271, + "narHash": "sha256-fXPDvB4VoS9k0oiW3CjN1w2cw9noqcloftXKMc8E0ng=", "owner": "logos-co", "repo": "logos-design-system", - "rev": "c20e95590a744785047a9d868c04b42cd773e970", + "rev": "75201e56002327864544b729ad0077bca7e5b03d", "type": "github" }, "original": { @@ -610,23 +586,24 @@ "logos-liblogos": { "inputs": { "logos-capability-module": "logos-capability-module", - "logos-cpp-sdk": "logos-cpp-sdk_3", - "logos-module": "logos-module", - "nix-bundle-appimage": "nix-bundle-appimage", - "nix-bundle-dir": "nix-bundle-dir_2", + "logos-cpp-sdk": "logos-cpp-sdk_2", + "logos-module": "logos-module_2", + "logos-nix": "logos-nix_7", + "logos-package-manager": "logos-package-manager", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-liblogos", - "logos-cpp-sdk", + "logos-nix", "nixpkgs" - ] + ], + "process-stats": "process-stats" }, "locked": { - "lastModified": 1772115748, - "narHash": "sha256-sPdAuYiLOjsulrk+uKMT7EG05ZlGT7OYEpgUh+f0nME=", + "lastModified": 1774967221, + "narHash": "sha256-i/8S4ldt0ikyjWrwp428Y7a7MRCIsS4R7pED0MFM52o=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "07780444deb99f10e600247e3696ba495f2f071a", + "rev": "da6ba7210e5145bfa5cb40590a2ac7e5dbbfd30d", "type": "github" }, "original": { @@ -637,10 +614,10 @@ }, "logos-liblogos_2": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_2", + "logos-cpp-sdk": "logos-cpp-sdk_4", "nixpkgs": [ - "logos-blockchain-module", - "logos-liblogos", + "liblogos_blockchain_module", + "logos-module-viewer", "logos-capability-module", "logos-liblogos", "logos-cpp-sdk", @@ -663,22 +640,25 @@ }, "logos-liblogos_3": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_6", + "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-blockchain-module", + "liblogos_blockchain_module", "logos-module-viewer", - "logos-capability-module", "logos-liblogos", "logos-cpp-sdk", "nixpkgs" ] }, "locked": { - "lastModified": 1761845775, - "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", + "lastModified": 1773696645, + "narHash": "sha256-GIb4xALCj3XK80rf6l89ZrZ/Y1YkqG1X/mfmVOUl/hw=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", + "rev": "5030aaaf86b89a382f3beb9426be4f8c2623215f", "type": "github" }, "original": { @@ -689,36 +669,9 @@ }, "logos-liblogos_4": { "inputs": { - "logos-capability-module": "logos-capability-module_3", - "logos-cpp-sdk": "logos-cpp-sdk_10", - "logos-module": "logos-module_2", + "logos-cpp-sdk": "logos-cpp-sdk_7", "nixpkgs": [ - "logos-blockchain-module", - "logos-module-viewer", - "logos-liblogos", - "logos-cpp-sdk", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1770154824, - "narHash": "sha256-WGI+3FkPdeytfLJ3ZJYr1O8esUnQjcmMJEYwB/EBZMs=", - "owner": "logos-co", - "repo": "logos-liblogos", - "rev": "901dd86d47216b15b6f1260b7b6bb4ecd88a8f9d", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-liblogos", - "type": "github" - } - }, - "logos-liblogos_5": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_9", - "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-module-viewer", "logos-liblogos", "logos-capability-module", @@ -741,11 +694,11 @@ "type": "github" } }, - "logos-liblogos_6": { + "logos-liblogos_5": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_13", + "logos-cpp-sdk": "logos-cpp-sdk_11", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-module-viewer", "logos-package-manager", "logos-liblogos", @@ -767,73 +720,27 @@ "type": "github" } }, - "logos-liblogos_7": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_15", - "nixpkgs": [ - "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_8": { + "logos-liblogos_6": { "inputs": { "logos-capability-module": "logos-capability-module_5", - "logos-cpp-sdk": "logos-cpp-sdk_19", - "logos-module": "logos-module_3", + "logos-cpp-sdk": "logos-cpp-sdk_15", + "logos-module": "logos-module_9", + "logos-nix": "logos-nix_30", + "logos-package-manager": "logos-package-manager_3", "nixpkgs": [ - "logos-liblogos", - "logos-cpp-sdk", + "logos-module-builder", + "logos-standalone-app", + "logos-nix", "nixpkgs" - ] + ], + "process-stats": "process-stats_2" }, "locked": { - "lastModified": 1770837874, - "narHash": "sha256-wr75lv1q4U1FS5+l/6ypwzJFJe06l2RyUvx1npoRS88=", + "lastModified": 1776084938, + "narHash": "sha256-0UL6tG6mK00HN99fm9CLJu3JA9ay2ry6dgeHfyApiWo=", "owner": "logos-co", "repo": "logos-liblogos", - "rev": "e3741c01fd3abf6b7bd9ff2fa8edf89c41fc0cea", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-liblogos", - "rev": "e3741c01fd3abf6b7bd9ff2fa8edf89c41fc0cea", - "type": "github" - } - }, - "logos-liblogos_9": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_18", - "nixpkgs": [ - "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", + "rev": "b293e9d70a04983778ef2ef3ef42596f76f41161", "type": "github" }, "original": { @@ -844,9 +751,119 @@ }, "logos-module": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_4", + "logos-nix": "logos-nix_3", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", + "logos-liblogos", + "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-builder": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_12", + "logos-module": "logos-module_4", + "logos-nix": "logos-nix_16", + "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": 1776372591, + "narHash": "sha256-uuY3FvSbWF11DR7JO9jyMDV25fLJoxT9TpDW7l/BngM=", + "owner": "logos-co", + "repo": "logos-module-builder", + "rev": "e14aaa89f9ef652daf201cfaf3d06817ac8a440e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module-builder", + "type": "github" + } + }, + "logos-module-viewer": { + "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": [ + "liblogos_blockchain_module", + "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", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "logos-module", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774633164, + "narHash": "sha256-TobXeKMS1RWYKo30ujYJNnrDVhu4U1JFdtL31yIOu8c=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "8ed727449a4a6713a8c819c213b0d5d25f575580", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-module_3": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_9", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-module-viewer", "logos-liblogos", "logos-module", "logos-cpp-sdk", @@ -867,51 +884,22 @@ "type": "github" } }, - "logos-module-viewer": { + "logos-module_4": { "inputs": { - "logos-capability-module": "logos-capability-module_2", - "logos-cpp-sdk": "logos-cpp-sdk_7", - "logos-liblogos": "logos-liblogos_4", - "logos-package-manager": "logos-package-manager", + "logos-nix": "logos-nix_15", "nixpkgs": [ - "logos-blockchain-module", - "logos-module-viewer", - "logos-liblogos", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1770804615, - "narHash": "sha256-0DuGGEgGHpRcVElWlQXqgseGN+xZ6cqXplRayqdNZQY=", - "owner": "logos-co", - "repo": "logos-module-viewer", - "rev": "2ed9def5db6d5b8d83e5a9671ce5c571bc86deff", - "type": "github" - }, - "original": { - "owner": "logos-co", - "repo": "logos-module-viewer", - "type": "github" - } - }, - "logos-module_2": { - "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_11", - "nixpkgs": [ - "logos-blockchain-module", - "logos-module-viewer", - "logos-liblogos", + "logos-module-builder", "logos-module", - "logos-cpp-sdk", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1770062426, - "narHash": "sha256-zc7ZxDTlqOCYGyEHhrTA/7GS1EWh7+4amdPUKh+gGds=", + "lastModified": 1775763932, + "narHash": "sha256-PrVdkHNN2PPXoUEJoJUKv61t6IeQ3iQSRarIpFr9GHE=", "owner": "logos-co", "repo": "logos-module", - "rev": "f7ee69d9ad9f27c84f04f59896e9194125e951dc", + "rev": "73cd9c4b2646dedb1b624a3178b32a7af1670047", "type": "github" }, "original": { @@ -920,22 +908,23 @@ "type": "github" } }, - "logos-module_3": { + "logos-module_5": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_20", + "logos-nix": "logos-nix_17", "nixpkgs": [ - "logos-liblogos", + "logos-module-builder", + "logos-plugin-core", "logos-module", - "logos-cpp-sdk", + "logos-nix", "nixpkgs" ] }, "locked": { - "lastModified": 1770062426, - "narHash": "sha256-zc7ZxDTlqOCYGyEHhrTA/7GS1EWh7+4amdPUKh+gGds=", + "lastModified": 1774988698, + "narHash": "sha256-Ugngv17u5CA3lOSNHN6nJ+/WpIyNn8yui0M2VDdkENk=", "owner": "logos-co", "repo": "logos-module", - "rev": "f7ee69d9ad9f27c84f04f59896e9194125e951dc", + "rev": "337223f2a72710d8052ca750510cd25d33e05047", "type": "github" }, "original": { @@ -944,16 +933,1172 @@ "type": "github" } }, + "logos-module_6": { + "inputs": { + "logos-nix": "logos-nix_19", + "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_7": { + "inputs": { + "logos-nix": "logos-nix_21", + "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_8": { + "inputs": { + "logos-nix": "logos-nix_26", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "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_9": { + "inputs": { + "logos-nix": "logos-nix_29", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "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-nix": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "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_10": { + "inputs": { + "nixpkgs": "nixpkgs_12" + }, + "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_11": { + "inputs": { + "nixpkgs": "nixpkgs_13" + }, + "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_12": { + "inputs": { + "nixpkgs": "nixpkgs_14" + }, + "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_13": { + "inputs": { + "nixpkgs": "nixpkgs_15" + }, + "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_14": { + "inputs": { + "nixpkgs": "nixpkgs_28" + }, + "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_29" + }, + "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_30" + }, + "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_17": { + "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_18": { + "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_19": { + "inputs": { + "nixpkgs": "nixpkgs_33" + }, + "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" + }, + "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_20": { + "inputs": { + "nixpkgs": "nixpkgs_34" + }, + "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_21": { + "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_22": { + "inputs": { + "nixpkgs": "nixpkgs_36" + }, + "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_37" + }, + "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_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_25": { + "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_26": { + "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_27": { + "inputs": { + "nixpkgs": "nixpkgs_41" + }, + "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_28": { + "inputs": { + "nixpkgs": "nixpkgs_42" + }, + "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_43" + }, + "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": 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_30": { + "inputs": { + "nixpkgs": "nixpkgs_44" + }, + "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_45" + }, + "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_46" + }, + "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_47" + }, + "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_48" + }, + "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_35": { + "inputs": { + "nixpkgs": "nixpkgs_49" + }, + "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_36": { + "inputs": { + "nixpkgs": "nixpkgs_50" + }, + "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_51" + }, + "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_38": { + "inputs": { + "nixpkgs": "nixpkgs_52" + }, + "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_53" + }, + "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_4": { + "inputs": { + "nixpkgs": "nixpkgs_6" + }, + "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_40": { + "inputs": { + "nixpkgs": "nixpkgs_54" + }, + "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_55" + }, + "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_42": { + "inputs": { + "nixpkgs": "nixpkgs_56" + }, + "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_43": { + "inputs": { + "nixpkgs": "nixpkgs_57" + }, + "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_44": { + "inputs": { + "nixpkgs": "nixpkgs_58" + }, + "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_45": { + "inputs": { + "nixpkgs": "nixpkgs_59" + }, + "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_46": { + "inputs": { + "nixpkgs": "nixpkgs_60" + }, + "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_47": { + "inputs": { + "nixpkgs": "nixpkgs_61" + }, + "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_48": { + "inputs": { + "nixpkgs": "nixpkgs_62" + }, + "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_49": { + "inputs": { + "nixpkgs": "nixpkgs_63" + }, + "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": 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_50": { + "inputs": { + "nixpkgs": "nixpkgs_64" + }, + "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_51": { + "inputs": { + "nixpkgs": "nixpkgs_65" + }, + "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_52": { + "inputs": { + "nixpkgs": "nixpkgs_66" + }, + "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_53": { + "inputs": { + "nixpkgs": "nixpkgs_67" + }, + "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_54": { + "inputs": { + "nixpkgs": "nixpkgs_68" + }, + "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_55": { + "inputs": { + "nixpkgs": "nixpkgs_69" + }, + "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_56": { + "inputs": { + "nixpkgs": "nixpkgs_70" + }, + "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_57": { + "inputs": { + "nixpkgs": "nixpkgs_71" + }, + "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_58": { + "inputs": { + "nixpkgs": "nixpkgs_72" + }, + "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_6": { + "inputs": { + "nixpkgs": "nixpkgs_8" + }, + "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_7": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, + "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_8": { + "inputs": { + "nixpkgs": "nixpkgs_10" + }, + "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_9": { + "inputs": { + "nixpkgs": "nixpkgs_11" + }, + "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-package": { "inputs": { - "nixpkgs": "nixpkgs_19" + "logos-nix": "logos-nix_9", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "logos-package-manager", + "logos-package", + "logos-nix", + "nixpkgs" + ] }, "locked": { - "lastModified": 1768925546, - "narHash": "sha256-Y4sgYs9wtZ9sHAuKl9LUy//ReeF4/AyK8HlnZsYrSqg=", + "lastModified": 1773965173, + "narHash": "sha256-toDnGXUthRcQm7vcEYzb2bLI7FE1tbfzH8Ie2Cnb9mk=", "owner": "logos-co", "repo": "logos-package", - "rev": "9230ae37c9d289c0c355dcf9fa40fd3be2e99f17", + "rev": "9e3730d5c0e3ec955761c05b50e3a6047ee4030b", "type": "github" }, "original": { @@ -964,11 +2109,39 @@ }, "logos-package-manager": { "inputs": { - "logos-cpp-sdk": "logos-cpp-sdk_12", - "logos-liblogos": "logos-liblogos_6", + "logos-nix": "logos-nix_8", "logos-package": "logos-package", + "nix-bundle-appimage": "nix-bundle-appimage", + "nix-bundle-dir": "nix-bundle-dir_2", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", + "logos-liblogos", + "logos-package-manager", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774635434, + "narHash": "sha256-9LRXf/Wy500rNO9IhDSH+PSuadS3TguNFCbcbI4YYZU=", + "owner": "logos-co", + "repo": "logos-package-manager", + "rev": "e5c25989861f4487c3dc8c7b3bc0062bcbc3221f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package-manager", + "type": "github" + } + }, + "logos-package-manager_2": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_10", + "logos-liblogos": "logos-liblogos_5", + "logos-package": "logos-package_2", + "nixpkgs": [ + "liblogos_blockchain_module", "logos-module-viewer", "logos-package-manager", "logos-liblogos", @@ -989,10 +2162,428 @@ "type": "github" } }, + "logos-package-manager_3": { + "inputs": { + "logos-nix": "logos-nix_31", + "logos-package": "logos-package_3", + "nix-bundle-appimage": "nix-bundle-appimage_3", + "nix-bundle-dir": "nix-bundle-dir_6", + "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_4": { + "inputs": { + "logos-nix": "logos-nix_48", + "logos-package": "logos-package_6", + "nix-bundle-appimage": "nix-bundle-appimage_4", + "nix-bundle-dir": "nix-bundle-dir_10", + "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": { + "nixpkgs": "nixpkgs_27" + }, + "locked": { + "lastModified": 1768925546, + "narHash": "sha256-Y4sgYs9wtZ9sHAuKl9LUy//ReeF4/AyK8HlnZsYrSqg=", + "owner": "logos-co", + "repo": "logos-package", + "rev": "9230ae37c9d289c0c355dcf9fa40fd3be2e99f17", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package", + "type": "github" + } + }, + "logos-package_3": { + "inputs": { + "logos-nix": "logos-nix_32", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "logos-package-manager", + "logos-package", + "logos-nix", + "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_4": { + "inputs": { + "logos-nix": "logos-nix_41", + "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_5": { + "inputs": { + "logos-nix": "logos-nix_45", + "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_6": { + "inputs": { + "logos-nix": "logos-nix_49", + "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=", + "owner": "logos-co", + "repo": "logos-package", + "rev": "ff93a0df15ceab255f27687d22d962ea2737efbe", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-package", + "type": "github" + } + }, + "logos-package_7": { + "inputs": { + "logos-nix": "logos-nix_54", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "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_8": { + "inputs": { + "logos-nix": "logos-nix_57", + "nixpkgs": [ + "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-plugin-core": { + "inputs": { + "logos-module": "logos-module_5", + "logos-nix": "logos-nix_18", + "nixpkgs": [ + "logos-module-builder", + "logos-plugin-core", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775835070, + "narHash": "sha256-RaJzt4sx6WrLtwhRhkGki/I+Bvt8fuC+p+oCcuLTm3g=", + "owner": "logos-co", + "repo": "logos-plugin-qt", + "rev": "78a04d603d910d864a26b158eca0882321258d44", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-plugin-qt", + "type": "github" + } + }, + "logos-plugin-qt": { + "inputs": { + "logos-module": "logos-module_6", + "logos-nix": "logos-nix_20", + "nixpkgs": [ + "logos-module-builder", + "logos-plugin-qt", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775835070, + "narHash": "sha256-RaJzt4sx6WrLtwhRhkGki/I+Bvt8fuC+p+oCcuLTm3g=", + "owner": "logos-co", + "repo": "logos-plugin-qt", + "rev": "78a04d603d910d864a26b158eca0882321258d44", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-plugin-qt", + "type": "github" + } + }, + "logos-qt-mcp": { + "inputs": { + "logos-nix": "logos-nix_38", + "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_4", + "logos-cpp-sdk": "logos-cpp-sdk_13", + "logos-design-system": "logos-design-system", + "logos-liblogos": "logos-liblogos_6", + "logos-nix": "logos-nix_37", + "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": 1776372380, + "narHash": "sha256-kleKGfcRgtIjeltogH0NCFrp5QwetlXsHJxOTllP13E=", + "owner": "logos-co", + "repo": "logos-standalone-app", + "rev": "5e122402898c1d896cc6b72db04c6277697a2f2f", + "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_43", + "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_39", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1776372308, + "narHash": "sha256-21SqqdOuHBLUGcYxGvjtC4iKp+wLGEQOKn64qLVl/+0=", + "owner": "logos-co", + "repo": "logos-view-module-runtime", + "rev": "5dc32e0131e9abf0a86c085119aa082d56486d9e", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-view-module-runtime", + "type": "github" + } + }, "nix-bundle-appimage": { "inputs": { + "logos-nix": "logos-nix_10", "nix-bundle-dir": "nix-bundle-dir", - "nixpkgs": "nixpkgs_8" + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "logos-package-manager", + "nix-bundle-appimage", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1773961597, + "narHash": "sha256-UEUlp3VRXBcj2YlOMTQdeW3qjyGJl2V3+GMf8IXwSWA=", + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "rev": "7343f6df1ebab357f51f23dff0af9d7e468638cb", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "type": "github" + } + }, + "nix-bundle-appimage_2": { + "inputs": { + "nix-bundle-dir": "nix-bundle-dir_3", + "nixpkgs": "nixpkgs_23" }, "locked": { "lastModified": 1772047346, @@ -1008,10 +2599,193 @@ "type": "github" } }, + "nix-bundle-appimage_3": { + "inputs": { + "logos-nix": "logos-nix_33", + "nix-bundle-dir": "nix-bundle-dir_5", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "logos-package-manager", + "nix-bundle-appimage", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455478, + "narHash": "sha256-S8IMfdDc+2Wwri0krLDsIUwSqmwanmvHAJWHOFo8ykk=", + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "rev": "2428125a4a1b34ad9119efa97edb98676283e3da", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "type": "github" + } + }, + "nix-bundle-appimage_4": { + "inputs": { + "logos-nix": "logos-nix_50", + "nix-bundle-dir": "nix-bundle-dir_9", + "nixpkgs": [ + "logos-module-builder", + "nix-bundle-logos-module-install", + "logos-package-manager", + "nix-bundle-appimage", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774455478, + "narHash": "sha256-S8IMfdDc+2Wwri0krLDsIUwSqmwanmvHAJWHOFo8ykk=", + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "rev": "2428125a4a1b34ad9119efa97edb98676283e3da", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "nix-bundle-appimage", + "type": "github" + } + }, "nix-bundle-dir": { "inputs": { + "logos-nix": "logos-nix_11", "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", + "logos-liblogos", + "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_10": { + "inputs": { + "logos-nix": "logos-nix_52", + "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_11": { + "inputs": { + "logos-nix": "logos-nix_55", + "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-dir_12": { + "inputs": { + "logos-nix": "logos-nix_58", + "nixpkgs": [ + "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-dir_2": { + "inputs": { + "logos-nix": "logos-nix_12", + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-liblogos", + "logos-package-manager", + "nix-bundle-dir", + "logos-nix", + "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_3": { + "inputs": { + "nixpkgs": [ + "liblogos_blockchain_module", + "logos-module-viewer", "logos-liblogos", "nix-bundle-appimage", "nixpkgs" @@ -1031,9 +2805,9 @@ "type": "github" } }, - "nix-bundle-dir_2": { + "nix-bundle-dir_4": { "inputs": { - "nixpkgs": "nixpkgs_9" + "nixpkgs": "nixpkgs_24" }, "locked": { "lastModified": 1771971384, @@ -1049,6 +2823,265 @@ "type": "github" } }, + "nix-bundle-dir_5": { + "inputs": { + "logos-nix": "logos-nix_34", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "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_35", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "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", + "logos-standalone-app", + "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-dir_8": { + "inputs": { + "logos-nix": "logos-nix_46", + "nixpkgs": [ + "logos-module-builder", + "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-dir_9": { + "inputs": { + "logos-nix": "logos-nix_51", + "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-lgx": { + "inputs": { + "logos-nix": "logos-nix_40", + "logos-package": "logos-package_4", + "nix-bundle-dir": "nix-bundle-dir_7", + "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_44", + "logos-package": "logos-package_5", + "nix-bundle-dir": "nix-bundle-dir_8", + "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_53", + "logos-package": "logos-package_7", + "nix-bundle-dir": "nix-bundle-dir_11", + "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-lgx_4": { + "inputs": { + "logos-nix": "logos-nix_56", + "logos-package": "logos-package_8", + "nix-bundle-dir": "nix-bundle-dir_12", + "nixpkgs": [ + "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_47", + "logos-package-manager": "logos-package-manager_4", + "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, @@ -1211,11 +3244,11 @@ }, "nixpkgs_19": { "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": { @@ -1291,11 +3324,11 @@ }, "nixpkgs_23": { "locked": { - "lastModified": 1759036355, - "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "lastModified": 1771848320, + "narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "rev": "2fc6539b481e1d2569f25f8799236694180c0993", "type": "github" }, "original": { @@ -1307,11 +3340,11 @@ }, "nixpkgs_24": { "locked": { - "lastModified": 1759036355, - "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "lastModified": 1770562336, + "narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "rev": "d6c71932130818840fc8fe9509cf50be8c64634f", "type": "github" }, "original": { @@ -1353,6 +3386,54 @@ "type": "github" } }, + "nixpkgs_27": { + "locked": { + "lastModified": 1768127708, + "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38", + "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": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_3": { "locked": { "lastModified": 1759036355, @@ -1369,6 +3450,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, @@ -1385,6 +3626,166 @@ "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_45": { + "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_46": { + "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_47": { + "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_48": { + "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_49": { + "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, @@ -1401,6 +3802,166 @@ "type": "github" } }, + "nixpkgs_50": { + "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_51": { + "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_52": { + "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_53": { + "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_54": { + "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_55": { + "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_56": { + "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_57": { + "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_58": { + "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_59": { + "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_6": { "locked": { "lastModified": 1759036355, @@ -1417,6 +3978,166 @@ "type": "github" } }, + "nixpkgs_60": { + "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_61": { + "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_62": { + "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_63": { + "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_64": { + "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_65": { + "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_66": { + "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_67": { + "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_68": { + "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_69": { + "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_7": { "locked": { "lastModified": 1759036355, @@ -1433,13 +4154,61 @@ "type": "github" } }, + "nixpkgs_70": { + "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_71": { + "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_72": { + "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_8": { "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": { @@ -1451,11 +4220,11 @@ }, "nixpkgs_9": { "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": { @@ -1465,23 +4234,68 @@ "type": "github" } }, - "root": { + "process-stats": { "inputs": { - "logos-blockchain-module": "logos-blockchain-module", - "logos-capability-module": "logos-capability-module_4", - "logos-cpp-sdk": "logos-cpp-sdk_16", - "logos-design-system": "logos-design-system", - "logos-liblogos": "logos-liblogos_8", + "logos-nix": "logos-nix_13", "nixpkgs": [ + "liblogos_blockchain_module", "logos-liblogos", + "process-stats", + "logos-nix", "nixpkgs" ] + }, + "locked": { + "lastModified": 1774455550, + "narHash": "sha256-T30DJXAMb+hezgnmlZe9qqa9LL5oolvuAdF5fIVz8A0=", + "owner": "logos-co", + "repo": "process-stats", + "rev": "8213ad456b4ac074a214f24fc2b378b1bdbb0234", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "process-stats", + "type": "github" + } + }, + "process-stats_2": { + "inputs": { + "logos-nix": "logos-nix_36", + "nixpkgs": [ + "logos-module-builder", + "logos-standalone-app", + "logos-liblogos", + "process-stats", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1775744159, + "narHash": "sha256-hTVAnDREBQOVHML6KU3K7Ge0CRBqnFIg7uYL7qDnD8o=", + "owner": "logos-co", + "repo": "process-stats", + "rev": "33ace1270f90c89b3565e803139c0970fcd1ce8f", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "process-stats", + "type": "github" + } + }, + "root": { + "inputs": { + "liblogos_blockchain_module": "liblogos_blockchain_module", + "logos-module-builder": "logos-module-builder", + "nix-bundle-lgx": "nix-bundle-lgx_4" } }, "rust-overlay": { "inputs": { "nixpkgs": [ - "logos-blockchain-module", + "liblogos_blockchain_module", "logos-blockchain", "nixpkgs" ] diff --git a/flake.nix b/flake.nix index 4af8968..83b6865 100644 --- a/flake.nix +++ b/flake.nix @@ -1,82 +1,44 @@ { - description = "Logos Blockchain UI - A Qt UI plugin for Logos Blockchain Module"; + description = "Blockchain UI plugin for the Logos application"; inputs = { - # Follow the same nixpkgs as logos-liblogos to ensure compatibility - nixpkgs.follows = "logos-liblogos/nixpkgs"; - logos-cpp-sdk.url = "github:logos-co/logos-cpp-sdk"; - logos-liblogos.url = "github:logos-co/logos-liblogos?rev=e3741c01fd3abf6b7bd9ff2fa8edf89c41fc0cea"; - logos-blockchain-module.url = "github:logos-blockchain/logos-blockchain-module"; - logos-capability-module.url = "github:logos-co/logos-capability-module"; - logos-design-system.url = "github:logos-co/logos-design-system"; - logos-design-system.inputs.nixpkgs.follows = "nixpkgs"; + logos-module-builder.url = "github:logos-co/logos-module-builder"; + nix-bundle-lgx.url = "github:logos-co/nix-bundle-lgx"; + liblogos_blockchain_module.url = "github:logos-blockchain/logos-blockchain-module"; }; - outputs = { self, nixpkgs, logos-cpp-sdk, logos-liblogos, logos-blockchain-module, logos-capability-module, logos-design-system }: - let - systems = [ "aarch64-darwin" "x86_64-darwin" "aarch64-linux" "x86_64-linux" ]; - forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f { - pkgs = import nixpkgs { inherit system; }; - logosSdk = logos-cpp-sdk.packages.${system}.default; - logosLiblogos = logos-liblogos.packages.${system}.default; - logosBlockchainModule = logos-blockchain-module.packages.${system}.default; - logosCapabilityModule = logos-capability-module.packages.${system}.default; - logosDesignSystem = logos-design-system.packages.${system}.default; - }); - in - { - packages = forAllSystems ({ pkgs, logosSdk, logosLiblogos, logosBlockchainModule, logosCapabilityModule, logosDesignSystem }: - let - # Common configuration - common = import ./nix/default.nix { - inherit pkgs logosSdk logosLiblogos; - }; - src = ./.; - - # Library package (default blockchain-module has lib + include via symlinkJoin) - lib = import ./nix/lib.nix { - inherit pkgs common src logosBlockchainModule; - }; - - # App package - app = import ./nix/app.nix { - inherit pkgs common src logosLiblogos logosBlockchainModule logosCapabilityModule logosDesignSystem; - logosBlockchainUI = lib; - }; - in - { - # Individual outputs - logos-blockchain-ui-lib = lib; - app = app; - lib = lib; + outputs = inputs@{ logos-module-builder, ... }: + logos-module-builder.lib.mkLogosQmlModule { + src = ./.; + configFile = ./metadata.json; + flakeInputs = inputs; - # Default package - default = lib; - } - ); + # The blockchain module is a legacy Rust module that does not ship a + # generated *_api.h header. The logos-cpp-generator --general-only step + # produces logos_sdk.h which #include's the missing header. Create an + # empty stub so compilation succeeds — we use the raw LogosAPIClient + # interface directly instead of the generated type-safe wrappers. + preConfigure = '' + mkdir -p ./generated_code/include - devShells = forAllSystems ({ pkgs, logosSdk, logosLiblogos, logosBlockchainModule, logosCapabilityModule, logosDesignSystem }: { - default = pkgs.mkShell { - nativeBuildInputs = [ - pkgs.cmake - pkgs.ninja - pkgs.pkg-config - ]; - buildInputs = [ - pkgs.qt6.qtbase - pkgs.qt6.qtremoteobjects - pkgs.zstd - pkgs.krb5 - pkgs.abseil-cpp - ]; - - shellHook = '' - export LOGOS_LIBLOGOS_ROOT="${logosLiblogos}" - export LOGOS_DESIGN_SYSTEM_ROOT="${logosDesignSystem}" - echo "Logos Blockchain UI development environment" - echo "LOGOS_LIBLOGOS_ROOT: $LOGOS_LIBLOGOS_ROOT" - ''; + # The blockchain module is a legacy Rust module that does not ship a + # generated *_api.h header. Create a minimal stub so logos_sdk.h + # compiles — we use the raw LogosAPIClient interface directly. + for dir in ./generated_code/include ./generated_code; do + if [ ! -f "$dir/liblogos_blockchain_module_api.h" ]; then + cat > "$dir/liblogos_blockchain_module_api.h" << 'STUB' + #pragma once + #include "logos_api.h" + class LiblogosBlockchainModule { + public: + explicit LiblogosBlockchainModule(LogosAPI*) {} }; - }); + STUB + fi + if [ ! -f "$dir/liblogos_blockchain_module_api.cpp" ]; then + echo "// Stub" > "$dir/liblogos_blockchain_module_api.cpp" + fi + done + ''; }; } diff --git a/interfaces/IComponent.h b/interfaces/IComponent.h deleted file mode 100644 index 06ad57a..0000000 --- a/interfaces/IComponent.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include -#include -#include - -class LogosAPI; - -class IComponent { -public: - virtual ~IComponent() = default; - virtual QWidget* createWidget(LogosAPI* logosAPI = nullptr) = 0; - virtual void destroyWidget(QWidget* widget) = 0; -}; - -#define IComponent_iid "com.logos.component.IComponent" -Q_DECLARE_INTERFACE(IComponent, IComponent_iid) diff --git a/metadata.json b/metadata.json index 90b7c65..b54865e 100644 --- a/metadata.json +++ b/metadata.json @@ -1,27 +1,24 @@ { "name": "blockchain_ui", "version": "1.0.0", - "description": "Blockchain UI module for the Logos application", - "author": "Logos Blockchain Team", - "type": "ui", - "main": "blockchain_ui", - "icon": ":/icons/blockchain.png", - "dependencies": ["liblogos_blockchain_module"], + "type": "ui_qml", "category": "blockchain", - "build": { - "type": "cmake", - "files": [ - "src/BlockchainPlugin.cpp", - "src/BlockchainPlugin.h", - "src/BlockchainBackend.cpp", - "src/BlockchainBackend.h", - "src/LogModel.cpp", - "src/LogModel.h", - "src/blockchain_resources.qrc" - ] - }, - "capabilities": [ - "ui_components", - "blockchain" - ] + "description": "Blockchain UI module for the Logos application", + "main": "blockchain_ui_plugin", + "icon": "src/icons/blockchain.png", + "view": "qml/BlockchainView.qml", + "dependencies": ["liblogos_blockchain_module"], + "nix": { + "packages": { + "build": [], + "runtime": ["qt6.qtdeclarative", "zstd", "krb5", "abseil-cpp"] + }, + "external_libraries": [], + "cmake": { + "find_packages": ["Qt6Gui"], + "extra_sources": [], + "extra_include_dirs": [], + "extra_link_libraries": ["Qt6::Gui"] + } + } } diff --git a/nix/app.nix b/nix/app.nix deleted file mode 100644 index d77c553..0000000 --- a/nix/app.nix +++ /dev/null @@ -1,216 +0,0 @@ -# Builds the logos-blockchain-ui-app standalone application -{ pkgs, common, src, logosLiblogos, logosBlockchainModule, logosCapabilityModule, logosBlockchainUI, logosDesignSystem }: - -pkgs.stdenv.mkDerivation rec { - pname = "logos-blockchain-ui-app"; - version = common.version; - - inherit src; - inherit (common) buildInputs meta; - - nativeBuildInputs = common.nativeBuildInputs ++ [ pkgs.patchelf pkgs.removeReferencesTo ]; - - # Provide Qt/GL runtime paths so the wrapper can inject them - qtLibPath = pkgs.lib.makeLibraryPath ( - [ - pkgs.qt6.qtbase - pkgs.qt6.qtremoteobjects - pkgs.zstd - pkgs.krb5 - pkgs.zlib - pkgs.glib - pkgs.stdenv.cc.cc - pkgs.freetype - pkgs.fontconfig - ] - ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ - pkgs.libglvnd - pkgs.mesa.drivers - pkgs.xorg.libX11 - pkgs.xorg.libXext - pkgs.xorg.libXrender - pkgs.xorg.libXrandr - pkgs.xorg.libXcursor - pkgs.xorg.libXi - pkgs.xorg.libXfixes - pkgs.xorg.libxcb - ] - ); - qtPluginPath = "${pkgs.qt6.qtbase}/lib/qt-6/plugins"; - qmlImportPath = "${placeholder "out"}/lib:${pkgs.qt6.qtbase}/lib/qt-6/qml"; - - # This is a GUI application, enable Qt wrapping - dontWrapQtApps = false; - - # This is an aggregate runtime layout; avoid stripping to prevent hook errors - dontStrip = true; - - # Ensure proper Qt environment setup via wrapper - qtWrapperArgs = [ - "--prefix" "LD_LIBRARY_PATH" ":" qtLibPath - "--prefix" "QT_PLUGIN_PATH" ":" qtPluginPath - "--prefix" "QML2_IMPORT_PATH" ":" qmlImportPath - ]; - - preConfigure = '' - runHook prePreConfigure - export MACOSX_DEPLOYMENT_TARGET=12.0 - runHook postPreConfigure - ''; - - # Additional environment variables for Qt and RPATH cleanup - preFixup = '' - runHook prePreFixup - - # Set up Qt environment variables - export QT_PLUGIN_PATH="${pkgs.qt6.qtbase}/lib/qt-6/plugins" - export QML_IMPORT_PATH="${pkgs.qt6.qtbase}/lib/qt-6/qml" - - # Remove any remaining references to /build/ in binaries and set proper RPATH - find $out -type f -executable -exec sh -c ' - if file "$1" | grep -q "ELF.*executable"; then - # Use patchelf to clean up RPATH if it contains /build/ - if patchelf --print-rpath "$1" 2>/dev/null | grep -q "/build/"; then - echo "Cleaning RPATH for $1" - patchelf --remove-rpath "$1" 2>/dev/null || true - fi - # Set proper RPATH for the main binary - if echo "$1" | grep -q "/logos-blockchain-ui-app$"; then - echo "Setting RPATH for $1" - patchelf --set-rpath "$out/lib" "$1" 2>/dev/null || true - fi - fi - ' _ {} \; - - # Also clean up shared libraries - find $out -name "*.so" -exec sh -c ' - if patchelf --print-rpath "$1" 2>/dev/null | grep -q "/build/"; then - echo "Cleaning RPATH for $1" - patchelf --remove-rpath "$1" 2>/dev/null || true - fi - ' _ {} \; - - runHook prePostFixup - ''; - - configurePhase = '' - runHook preConfigure - - echo "Configuring logos-blockchain-ui-app..." - - test -d "${logosLiblogos}" || (echo "liblogos not found" && exit 1) - test -d "${logosBlockchainModule}" || (echo "blockchain-module not found" && exit 1) - test -d "${logosCapabilityModule}" || (echo "capability-module not found" && exit 1) - test -d "${logosBlockchainUI}" || (echo "blockchain-ui not found" && exit 1) - test -d "${logosDesignSystem}" || (echo "logos-design-system not found" && exit 1) - - cmake -S app -B build \ - -GNinja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \ - -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=FALSE \ - -DCMAKE_INSTALL_RPATH="" \ - -DCMAKE_SKIP_BUILD_RPATH=TRUE \ - -DLOGOS_LIBLOGOS_ROOT=${logosLiblogos} - - runHook postConfigure - ''; - - buildPhase = '' - runHook preBuild - - cmake --build build - echo "logos-blockchain-ui-app built successfully!" - - runHook postBuild - ''; - - installPhase = '' - runHook preInstall - - # Create output directories - mkdir -p $out/bin $out/lib $out/modules - - # Install our app binary - if [ -f "build/bin/logos-blockchain-ui-app" ]; then - cp build/bin/logos-blockchain-ui-app "$out/bin/" - echo "Installed logos-blockchain-ui-app binary" - fi - - # Copy the core binaries from liblogos - if [ -f "${logosLiblogos}/bin/logoscore" ]; then - cp -L "${logosLiblogos}/bin/logoscore" "$out/bin/" - echo "Installed logoscore binary" - fi - if [ -f "${logosLiblogos}/bin/logos_host" ]; then - cp -L "${logosLiblogos}/bin/logos_host" "$out/bin/" - echo "Installed logos_host binary" - fi - - # Copy required shared libraries from liblogos - if ls "${logosLiblogos}/lib/"liblogos_core.* >/dev/null 2>&1; then - cp -L "${logosLiblogos}/lib/"liblogos_core.* "$out/lib/" || true - fi - - # Determine platform-specific plugin extension - OS_EXT="so" - case "$(uname -s)" in - Darwin) OS_EXT="dylib";; - Linux) OS_EXT="so";; - MINGW*|MSYS*|CYGWIN*) OS_EXT="dll";; - esac - - # Copy module plugins into the modules directory - if [ -f "${logosCapabilityModule}/lib/capability_module_plugin.$OS_EXT" ]; then - cp -L "${logosCapabilityModule}/lib/capability_module_plugin.$OS_EXT" "$out/modules/" - fi - if [ -f "${logosBlockchainModule}/lib/liblogos_blockchain_module.$OS_EXT" ]; then - cp -L "${logosBlockchainModule}/lib/liblogos_blockchain_module.$OS_EXT" "$out/modules/" - fi - - # Copy liblogos_blockchain library to modules directory (needed by blockchain module) - if [ -f "${logosBlockchainModule}/lib/liblogos_blockchain.$OS_EXT" ]; then - cp -L "${logosBlockchainModule}/lib/liblogos_blockchain.$OS_EXT" "$out/modules/" - fi - - # Copy circuits from blockchain module to lib (needed at runtime) - if [ -d "${logosBlockchainModule}/share/circuits" ]; then - cp -r "${logosBlockchainModule}/share/circuits" "$out/modules/" - fi - - # Copy blockchain_ui Qt plugin to root directory (not modules, as it's loaded differently) - if [ -f "${logosBlockchainUI}/lib/blockchain_ui.$OS_EXT" ]; then - cp -L "${logosBlockchainUI}/lib/blockchain_ui.$OS_EXT" "$out/" - fi - - # Copy design system QML modules (Logos.Theme, Logos.Controls) for runtime - if [ -d "${logosDesignSystem}/lib/Logos/Theme" ]; then - mkdir -p "$out/lib/Logos" - cp -R "${logosDesignSystem}/lib/Logos/Theme" "$out/lib/Logos/" - echo "Copied Logos.Theme to lib/Logos/Theme/" - fi - if [ -d "${logosDesignSystem}/lib/Logos/Controls" ]; then - mkdir -p "$out/lib/Logos" - cp -R "${logosDesignSystem}/lib/Logos/Controls" "$out/lib/Logos/" - echo "Copied Logos.Controls to lib/Logos/Controls/" - fi - - cat > $out/README.txt </dev/null || true - exit 1 - fi - - # Copy circuits from blockchain module so result/lib/circuits is available - if [ -d "${logosBlockchainModule}/share/circuits" ]; then - cp -r "${logosBlockchainModule}/share/circuits" $out/modules/ - fi - - runHook postInstall - ''; -} diff --git a/src/BlockchainBackend.cpp b/src/BlockchainBackend.cpp index fe7da1e..c4fb101 100644 --- a/src/BlockchainBackend.cpp +++ b/src/BlockchainBackend.cpp @@ -1,154 +1,100 @@ #include "BlockchainBackend.h" +#include "logos_api.h" +#include "logos_api_client.h" + #include #include -#include #include +#include #include #include #include #include -#include #include #include #include #include -namespace { - const char SETTINGS_ORG[] = "Logos"; - const char SETTINGS_APP[] = "BlockchainUI"; - const char USER_CONFIG_KEY[] = "userConfigPath"; - const char DEPLOYMENT_CONFIG_KEY[] = "deploymentConfigPath"; - const QString BLOCKCHAIN_MODULE_NAME = QStringLiteral("liblogos_blockchain_module"); -} +const QString BlockchainBackend::BLOCKCHAIN_MODULE_NAME = + QStringLiteral("liblogos_blockchain_module"); BlockchainBackend::BlockchainBackend(LogosAPI* logosAPI, QObject* parent) - : QObject(parent), - m_status(NotStarted), - m_userConfig(""), - m_deploymentConfig(""), - m_logModel(new LogModel(this)), - m_accountsModel(new AccountsModel(this)), - m_logosAPI(nullptr), - m_blockchainClient(nullptr) + : BlockchainBackendSimpleSource(parent) + , m_logosAPI(logosAPI) + , m_accountsModel(new AccountsModel(this)) + , m_logModel(new LogModel(this)) { - QSettings s(SETTINGS_ORG, SETTINGS_APP); - const QString envConfigPath = QString::fromUtf8(qgetenv("LB_CONFIG_PATH")); - const QString savedUserConfig = s.value(USER_CONFIG_KEY).toString(); - const QString savedDeploymentConfig = s.value(DEPLOYMENT_CONFIG_KEY).toString(); + setStatus(NotStarted); + setUseGeneratedConfig(false); + setGeneratedUserConfigPath( + QDir::currentPath() + QStringLiteral("/user_config.yaml")); - if (!envConfigPath.isEmpty()) { - m_userConfig = envConfigPath; - } else if (!savedUserConfig.isEmpty()) { - m_userConfig = savedUserConfig; - } - if (!savedDeploymentConfig.isEmpty()) { - m_deploymentConfig = savedDeploymentConfig; - } + // Restore saved config paths + QSettings s("Logos", "BlockchainUI"); + const QString envConfigPath = + QString::fromUtf8(qgetenv("LB_CONFIG_PATH")); + const QString savedUserConfig = + s.value("userConfigPath").toString(); + const QString savedDeploymentConfig = + s.value("deploymentConfigPath").toString(); - if (!logosAPI) { - logosAPI = new LogosAPI("blockchain_ui", this); - } + if (!envConfigPath.isEmpty()) + setUserConfig(envConfigPath); + else if (!savedUserConfig.isEmpty()) + setUserConfig(savedUserConfig); - m_logosAPI = logosAPI; - m_blockchainClient = m_logosAPI->getClient(BLOCKCHAIN_MODULE_NAME); + if (!savedDeploymentConfig.isEmpty()) + setDeploymentConfig(savedDeploymentConfig); - if (!m_blockchainClient) { - setStatus(ErrorNotInitialized); + // Persist config paths on change + connect(this, &BlockchainBackendSimpleSource::userConfigChanged, this, [this]() { + QSettings("Logos", "BlockchainUI") + .setValue("userConfigPath", userConfig()); + }); + connect(this, &BlockchainBackendSimpleSource::deploymentConfigChanged, this, [this]() { + QSettings("Logos", "BlockchainUI") + .setValue("deploymentConfigPath", deploymentConfig()); + }); + + if (!m_logosAPI) { + qWarning() << "BlockchainBackend: constructed without LogosAPI"; return; } - QObject* replica = m_blockchainClient->requestObject(BLOCKCHAIN_MODULE_NAME); + m_blockchainClient = m_logosAPI->getClient(BLOCKCHAIN_MODULE_NAME); + if (!m_blockchainClient) { + setStatus(ErrorNotInitialized); + qWarning() << "BlockchainBackend: failed to get blockchain module client"; + return; + } + + LogosObject* replica = + m_blockchainClient->requestObject(BLOCKCHAIN_MODULE_NAME); if (replica) { - replica->setParent(this); - m_blockchainClient->onEvent(replica, this, "newBlock", [this](const QString&, const QVariantList& data) { - onNewBlock(data); - }); + m_blockchainClient->onEvent( + replica, "newBlock", + [this](const QString&, const QVariantList& data) { + const QString timestamp = + QDateTime::currentDateTime().toString("HH:mm:ss"); + QString line; + if (!data.isEmpty()) + line = QString("[%1] New block: %2") + .arg(timestamp, data.first().toString()); + else + line = QString("[%1] New block (no data)").arg(timestamp); + m_logModel->append(line); + }); } else { setStatus(ErrorSubscribeFailed); } + + qDebug() << "BlockchainBackend: initialized"; } BlockchainBackend::~BlockchainBackend() { - stopBlockchain(); -} - -void BlockchainBackend::setStatus(BlockchainStatus newStatus) -{ - if (m_status != newStatus) { - m_status = newStatus; - emit statusChanged(); - } -} - -void BlockchainBackend::setUserConfig(const QString& path) -{ - const QString localPath = QUrl::fromUserInput(path).toLocalFile(); - if (m_userConfig != localPath) { - m_userConfig = localPath; - QSettings s(SETTINGS_ORG, SETTINGS_APP); - s.setValue(USER_CONFIG_KEY, m_userConfig); - emit userConfigChanged(); - } -} - -void BlockchainBackend::setDeploymentConfig(const QString& path) -{ - const QString localPath = QUrl::fromUserInput(path).toLocalFile(); - if (m_deploymentConfig != localPath) { - m_deploymentConfig = localPath; - QSettings s(SETTINGS_ORG, SETTINGS_APP); - s.setValue(DEPLOYMENT_CONFIG_KEY, m_deploymentConfig); - emit deploymentConfigChanged(); - } -} - -void BlockchainBackend::setUseGeneratedConfig(bool useGenerated) -{ - if (m_useGeneratedConfig != useGenerated) { - m_useGeneratedConfig = useGenerated; - emit useGeneratedConfigChanged(); - } -} - -void BlockchainBackend::clearLogs() -{ - m_logModel->clear(); -} - -void BlockchainBackend::copyToClipboard(const QString& text) -{ - if (QGuiApplication::clipboard()) - QGuiApplication::clipboard()->setText(text); -} - -QString BlockchainBackend::getBalance(const QString& addressHex) -{ - QString result; - if (!m_blockchainClient) { - result = QStringLiteral("Error: Module not initialized."); - } else { - QVariant v = m_blockchainClient->invokeRemoteMethod(BLOCKCHAIN_MODULE_NAME, "wallet_get_balance", addressHex); - result = v.isValid() ? v.toString() : QStringLiteral("Error: Call failed."); - } - m_accountsModel->setBalanceForAddress(addressHex, result); - return result; -} - -QString BlockchainBackend::transferFunds(const QString& fromKeyHex, const QString& toKeyHex, const QString& amountStr) -{ - if (!m_blockchainClient) { - return QStringLiteral("Error: Module not initialized."); - } - QVariant result = m_blockchainClient->invokeRemoteMethod( - BLOCKCHAIN_MODULE_NAME, - "wallet_transfer_funds", - fromKeyHex, - fromKeyHex, - toKeyHex, - amountStr, - QString()); - return result.isValid() ? result.toString() : QStringLiteral("Error: Call failed."); + if (status() == Running || status() == Starting) + stopBlockchain(); } void BlockchainBackend::startBlockchain() @@ -161,7 +107,7 @@ void BlockchainBackend::startBlockchain() setStatus(Starting); QVariant result = m_blockchainClient->invokeRemoteMethod( - BLOCKCHAIN_MODULE_NAME, "start", m_userConfig, m_deploymentConfig); + BLOCKCHAIN_MODULE_NAME, "start", userConfig(), deploymentConfig()); int resultCode = result.isValid() ? result.toInt() : -1; if (resultCode == 0 || resultCode == 1) { @@ -169,40 +115,15 @@ void BlockchainBackend::startBlockchain() QTimer::singleShot(500, this, [this]() { refreshAccounts(); }); } else if (resultCode == 2) { setStatus(ErrorConfigMissing); - } else if (resultCode == 3) { - setStatus(ErrorStartFailed); } else { setStatus(ErrorStartFailed); } } -void BlockchainBackend::refreshAccounts() -{ - if (!m_blockchainClient) return; - QVariant result = m_blockchainClient->invokeRemoteMethod(BLOCKCHAIN_MODULE_NAME, "wallet_get_known_addresses"); - QStringList list = result.isValid() && result.canConvert() ? result.toStringList() : QStringList(); - qDebug() << "BlockchainBackend: received from blockchain lib: type=QStringList, count=" << list.size(); - m_accountsModel->setAddresses(list); - QTimer::singleShot(0, this, [this, list]() { fetchBalancesForAccounts(list); }); -} - -void BlockchainBackend::fetchBalancesForAccounts(const QStringList& list) -{ - if (!m_blockchainClient) return; - const int n = list.size(); - for (int i = 0; i < n; ++i) { - const QString address = list[i]; - if (address.isEmpty()) continue; - const QString balance = getBalance(address); - m_accountsModel->setBalanceForAddress(address, balance); - } -} - void BlockchainBackend::stopBlockchain() { - if (m_status != Running && m_status != Starting) { + if (status() != Running && status() != Starting) return; - } if (!m_blockchainClient) { setStatus(ErrorNotInitialized); @@ -211,27 +132,69 @@ void BlockchainBackend::stopBlockchain() setStatus(Stopping); - QVariant result = m_blockchainClient->invokeRemoteMethod(BLOCKCHAIN_MODULE_NAME, "stop"); + QVariant result = m_blockchainClient->invokeRemoteMethod( + BLOCKCHAIN_MODULE_NAME, "stop"); int resultCode = result.isValid() ? result.toInt() : -1; - if (resultCode == 0 || resultCode == 1) { + if (resultCode == 0 || resultCode == 1) setStatus(Stopped); - } else { + else setStatus(ErrorStopFailed); +} + +void BlockchainBackend::refreshAccounts() +{ + if (!m_blockchainClient) return; + + QVariant result = m_blockchainClient->invokeRemoteMethod( + BLOCKCHAIN_MODULE_NAME, "wallet_get_known_addresses"); + QStringList list = + result.isValid() && result.canConvert() + ? result.toStringList() + : QStringList(); + + m_accountsModel->setAddresses(list); + + QTimer::singleShot(0, this, + [this, list]() { fetchBalancesForAccounts(list); }); +} + +void BlockchainBackend::fetchBalancesForAccounts(const QStringList& list) +{ + if (!m_blockchainClient) return; + for (const QString& address : list) { + if (address.isEmpty()) continue; + getBalance(address); } } -void BlockchainBackend::onNewBlock(const QVariantList& data) +QString BlockchainBackend::getBalance(QString addressHex) { - QString timestamp = QDateTime::currentDateTime().toString("HH:mm:ss"); - QString line; - if (!data.isEmpty()) { - QString blockInfo = data.first().toString(); - line = QString("[%1] 📦 New block: %2").arg(timestamp, blockInfo); + QString result; + if (!m_blockchainClient) { + result = QStringLiteral("Error: Module not initialized."); } else { - line = QString("[%1] 📦 New block (no data)").arg(timestamp); + QVariant v = m_blockchainClient->invokeRemoteMethod( + BLOCKCHAIN_MODULE_NAME, "wallet_get_balance", addressHex); + result = v.isValid() ? v.toString() + : QStringLiteral("Error: Call failed."); } - m_logModel->append(line); + + m_accountsModel->setBalanceForAddress(addressHex, result); + return result; +} + +QString BlockchainBackend::transferFunds( + QString fromKeyHex, QString toKeyHex, QString amountStr) +{ + if (!m_blockchainClient) + return QStringLiteral("Error: Module not initialized."); + + QVariant result = m_blockchainClient->invokeRemoteMethod( + BLOCKCHAIN_MODULE_NAME, "wallet_transfer_funds", + fromKeyHex, fromKeyHex, toKeyHex, amountStr, QString()); + return result.isValid() ? result.toString() + : QStringLiteral("Error: Call failed."); } static QString toLocalPath(const QString& pathInput) @@ -241,30 +204,22 @@ static QString toLocalPath(const QString& pathInput) return QUrl::fromUserInput(pathInput).toLocalFile(); } -int BlockchainBackend::generateConfig(const QString& outputPath, - const QStringList& initialPeers, - int netPort, - int blendPort, - const QString& httpAddr, - const QString& externalAddress, - bool noPublicIpCheck, - int deploymentMode, - const QString& deploymentConfigPath, - const QString& statePath) +int BlockchainBackend::generateConfig( + QString outputPath, QStringList initialPeers, int netPort, int blendPort, + QString httpAddr, QString externalAddress, bool noPublicIpCheck, + int deploymentMode, QString deploymentConfigPath, QString statePath) { - if (!m_blockchainClient) { + if (!m_blockchainClient) return -1; - } + QVariantMap normalized; - // Output path: default if empty, then normalize QString out = outputPath.trimmed(); - if (out.isEmpty()) { + if (out.isEmpty()) out = generatedUserConfigPath(); - } else { + else out = toLocalPath(out); - } - normalized.insert(QStringLiteral("output"), out); + normalized.insert("output", out); if (!initialPeers.isEmpty()) { QVariantList peersList; @@ -273,40 +228,48 @@ int BlockchainBackend::generateConfig(const QString& outputPath, peersList.append(p.trimmed()); } if (!peersList.isEmpty()) - normalized.insert(QStringLiteral("initial_peers"), peersList); + normalized.insert("initial_peers", peersList); } if (netPort > 0) - normalized.insert(QStringLiteral("net_port"), netPort); + normalized.insert("net_port", netPort); if (blendPort > 0) - normalized.insert(QStringLiteral("blend_port"), blendPort); + normalized.insert("blend_port", blendPort); if (!httpAddr.trimmed().isEmpty()) - normalized.insert(QStringLiteral("http_addr"), httpAddr.trimmed()); + normalized.insert("http_addr", httpAddr.trimmed()); if (!externalAddress.trimmed().isEmpty()) - normalized.insert(QStringLiteral("external_address"), externalAddress.trimmed()); + normalized.insert("external_address", externalAddress.trimmed()); if (noPublicIpCheck) - normalized.insert(QStringLiteral("no_public_ip_check"), true); + normalized.insert("no_public_ip_check", true); if (deploymentMode == 0) { QVariantMap deployment; - deployment.insert(QStringLiteral("well_known_deployment"), QStringLiteral("devnet")); - normalized.insert(QStringLiteral("deployment"), deployment); - } else if (deploymentMode == 1 && !deploymentConfigPath.trimmed().isEmpty()) { + deployment.insert("well_known_deployment", "devnet"); + normalized.insert("deployment", deployment); + } else if (deploymentMode == 1 + && !deploymentConfigPath.trimmed().isEmpty()) { QVariantMap deployment; - deployment.insert(QStringLiteral("config_path"), toLocalPath(deploymentConfigPath.trimmed())); - normalized.insert(QStringLiteral("deployment"), deployment); + deployment.insert("config_path", + toLocalPath(deploymentConfigPath.trimmed())); + normalized.insert("deployment", deployment); } if (!statePath.trimmed().isEmpty()) - normalized.insert(QStringLiteral("state_path"), toLocalPath(statePath.trimmed())); + normalized.insert("state_path", toLocalPath(statePath.trimmed())); const QJsonDocument doc = QJsonDocument::fromVariant(normalized); - const QByteArray jsonBytes = doc.toJson(QJsonDocument::Compact); - const QString jsonToSend = QString::fromUtf8(jsonBytes); + const QString jsonToSend = + QString::fromUtf8(doc.toJson(QJsonDocument::Compact)); QVariant result = m_blockchainClient->invokeRemoteMethod( BLOCKCHAIN_MODULE_NAME, "generate_user_config_from_str", jsonToSend); return result.isValid() ? result.toInt() : -1; } -QString BlockchainBackend::generatedUserConfigPath() const +void BlockchainBackend::clearLogs() { - return QDir::currentPath() + QStringLiteral("/user_config.yaml"); + m_logModel->clear(); +} + +void BlockchainBackend::copyToClipboard(QString text) +{ + if (QGuiApplication::clipboard()) + QGuiApplication::clipboard()->setText(text); } diff --git a/src/BlockchainBackend.h b/src/BlockchainBackend.h index 9dad1f6..ee58990 100644 --- a/src/BlockchainBackend.h +++ b/src/BlockchainBackend.h @@ -1,96 +1,64 @@ -#pragma once +#ifndef BLOCKCHAIN_BACKEND_H +#define BLOCKCHAIN_BACKEND_H #include #include #include -#include -#include "logos_api.h" -#include "logos_api_client.h" +#include + +#include "rep_BlockchainBackend_source.h" + #include "AccountsModel.h" #include "LogModel.h" -class BlockchainBackend : public QObject { +class LogosAPI; +class LogosAPIClient; + +// Source-side implementation of the BlockchainBackend .rep interface. +// +// Inheriting from BlockchainBackendSimpleSource gives us the generated PROPs, +// SLOTs and SIGNALs from BlockchainBackend.rep. +// +// AccountsModel* / LogModel* are subclass-only Q_PROPERTYs — QAbstractItemModel* +// can't flow through a .rep, so ui-host auto-remotes each such property as +// "/" (see logos-view-module-runtime/ui-host/main.cpp). +// QML acquires them via logos.model("blockchain_ui", "accounts"|"logs"). +class BlockchainBackend : public BlockchainBackendSimpleSource +{ Q_OBJECT + Q_PROPERTY(AccountsModel* accounts READ accounts CONSTANT) + Q_PROPERTY(LogModel* logs READ logs CONSTANT) public: - enum BlockchainStatus { - NotStarted = 0, - Starting, - Running, - Stopping, - Stopped, - Error, - ErrorNotInitialized, - ErrorConfigMissing, - ErrorStartFailed, - ErrorStopFailed, - ErrorSubscribeFailed - }; - Q_ENUM(BlockchainStatus) + explicit BlockchainBackend(LogosAPI* logosAPI, QObject* parent = nullptr); + ~BlockchainBackend() override; - Q_PROPERTY(BlockchainStatus status READ status NOTIFY statusChanged) - Q_PROPERTY(QString userConfig READ userConfig WRITE setUserConfig NOTIFY userConfigChanged) - Q_PROPERTY(QString deploymentConfig READ deploymentConfig WRITE setDeploymentConfig NOTIFY deploymentConfigChanged) - Q_PROPERTY(bool useGeneratedConfig READ useGeneratedConfig WRITE setUseGeneratedConfig NOTIFY useGeneratedConfigChanged) - Q_PROPERTY(LogModel* logModel READ logModel CONSTANT) - Q_PROPERTY(AccountsModel* accountsModel READ accountsModel CONSTANT) - Q_PROPERTY(QString generatedUserConfigPath READ generatedUserConfigPath CONSTANT) - - explicit BlockchainBackend(LogosAPI* logosAPI = nullptr, QObject* parent = nullptr); - ~BlockchainBackend(); - - BlockchainStatus status() const { return m_status; } - QString userConfig() const { return m_userConfig; } - QString deploymentConfig() const { return m_deploymentConfig; } - bool useGeneratedConfig() const { return m_useGeneratedConfig; } - LogModel* logModel() const { return m_logModel; } - AccountsModel* accountsModel() const { return m_accountsModel; } - - void setUserConfig(const QString& path); - void setDeploymentConfig(const QString& path); - void setUseGeneratedConfig(bool useGenerated); - Q_INVOKABLE void clearLogs(); - Q_INVOKABLE void copyToClipboard(const QString& text); - Q_INVOKABLE QString getBalance(const QString& addressHex); - Q_INVOKABLE QString transferFunds( - const QString& fromKeyHex, - const QString& toKeyHex, - const QString& amountStr); - Q_INVOKABLE void startBlockchain(); - Q_INVOKABLE void stopBlockchain(); - Q_INVOKABLE void refreshAccounts(); - Q_INVOKABLE int generateConfig(const QString& outputPath, - const QStringList& initialPeers, - int netPort, - int blendPort, - const QString& httpAddr, - const QString& externalAddress, - bool noPublicIpCheck, - int deploymentMode, - const QString& deploymentConfigPath, - const QString& statePath); - Q_INVOKABLE QString generatedUserConfigPath() const; + AccountsModel* accounts() const { return m_accountsModel; } + LogModel* logs() const { return m_logModel; } public slots: - void onNewBlock(const QVariantList& data); - -signals: - void statusChanged(); - void userConfigChanged(); - void deploymentConfigChanged(); - void useGeneratedConfigChanged(); + // Overrides of the pure-virtual slots generated from the .rep. + void startBlockchain() override; + void stopBlockchain() override; + void refreshAccounts() override; + QString getBalance(QString addressHex) override; + QString transferFunds(QString fromKeyHex, QString toKeyHex, QString amountStr) override; + int generateConfig(QString outputPath, QStringList initialPeers, int netPort, + int blendPort, QString httpAddr, QString externalAddress, + bool noPublicIpCheck, int deploymentMode, + QString deploymentConfigPath, QString statePath) override; + void clearLogs() override; + void copyToClipboard(QString text) override; private: - void setStatus(BlockchainStatus newStatus); void fetchBalancesForAccounts(const QStringList& list); - BlockchainStatus m_status; - QString m_userConfig; - QString m_deploymentConfig; - bool m_useGeneratedConfig = false; - LogModel* m_logModel; - AccountsModel* m_accountsModel; + LogosAPI* m_logosAPI = nullptr; + LogosAPIClient* m_blockchainClient = nullptr; + AccountsModel* m_accountsModel = nullptr; + LogModel* m_logModel = nullptr; - LogosAPI* m_logosAPI; - LogosAPIClient* m_blockchainClient; + static const QString BLOCKCHAIN_MODULE_NAME; }; + +#endif // BLOCKCHAIN_BACKEND_H diff --git a/src/BlockchainBackend.rep b/src/BlockchainBackend.rep new file mode 100644 index 0000000..f518c9e --- /dev/null +++ b/src/BlockchainBackend.rep @@ -0,0 +1,19 @@ +class BlockchainBackend +{ + ENUM BlockchainStatus { NotStarted=0, Starting=1, Running=2, Stopping=3, Stopped=4, Error=5, ErrorNotInitialized=6, ErrorConfigMissing=7, ErrorStartFailed=8, ErrorStopFailed=9, ErrorSubscribeFailed=10 } + + PROP(BlockchainStatus status READONLY) + PROP(QString userConfig READWRITE) + PROP(QString deploymentConfig READWRITE) + PROP(bool useGeneratedConfig READWRITE) + PROP(QString generatedUserConfigPath READONLY) + + SLOT(void startBlockchain()) + SLOT(void stopBlockchain()) + SLOT(void refreshAccounts()) + SLOT(QString getBalance(QString addressHex)) + SLOT(QString transferFunds(QString fromKeyHex, QString toKeyHex, QString amountStr)) + SLOT(int generateConfig(QString outputPath, QStringList initialPeers, int netPort, int blendPort, QString httpAddr, QString externalAddress, bool noPublicIpCheck, int deploymentMode, QString deploymentConfigPath, QString statePath)) + SLOT(void clearLogs()) + SLOT(void copyToClipboard(QString text)) +} diff --git a/src/BlockchainPlugin.cpp b/src/BlockchainPlugin.cpp index b52f7a6..c001c0b 100644 --- a/src/BlockchainPlugin.cpp +++ b/src/BlockchainPlugin.cpp @@ -1,54 +1,19 @@ #include "BlockchainPlugin.h" #include "BlockchainBackend.h" -#include "LogModel.h" -#include -#include -#include + #include -#include -#include -#include -#include -QWidget* BlockchainPlugin::createWidget(LogosAPI* logosAPI) { - qDebug() << "BlockchainPlugin::createWidget called"; - - QQuickWidget* quickWidget = new QQuickWidget(); - quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); - - qmlRegisterType("BlockchainBackend", 1, 0, "BlockchainBackend"); - qmlRegisterType("BlockchainBackend", 1, 0, "LogModel"); - - BlockchainBackend* backend = new BlockchainBackend(logosAPI, quickWidget); - quickWidget->rootContext()->setContextProperty("backend", backend); - - QString qmlSource = "qrc:/qml/BlockchainView.qml"; - QString importPath = "qrc:/qml"; - - QString envPath = QString::fromUtf8(qgetenv("BLOCKCHAIN_UI_QML_PATH")).trimmed(); - if (!envPath.isEmpty()) { - QFileInfo info(envPath); - if (info.isDir()) { - QString main = QDir(info.absoluteFilePath()).absoluteFilePath("BlockchainView.qml"); - if (QFile::exists(main)) { - importPath = info.absoluteFilePath(); - qmlSource = QUrl::fromLocalFile(main).toString(); - } else { - qWarning() << "BLOCKCHAIN_UI_QML_PATH: BlockchainView.qml not found in" << info.absoluteFilePath(); - } - } - } - - quickWidget->engine()->addImportPath(importPath); - quickWidget->setSource(QUrl(qmlSource)); - - if (quickWidget->status() == QQuickWidget::Error) { - qWarning() << "BlockchainPlugin: Failed to load QML:" << quickWidget->errors(); - } - - return quickWidget; +BlockchainPlugin::BlockchainPlugin(QObject* parent) + : QObject(parent) +{ } -void BlockchainPlugin::destroyWidget(QWidget* widget) { - delete widget; +BlockchainPlugin::~BlockchainPlugin() = default; + +void BlockchainPlugin::initLogos(LogosAPI* api) +{ + if (m_backend) return; + m_backend = new BlockchainBackend(api, this); + setBackend(m_backend); + qDebug() << "BlockchainPlugin: backend initialized"; } diff --git a/src/BlockchainPlugin.h b/src/BlockchainPlugin.h index 0480555..2fa4cf4 100644 --- a/src/BlockchainPlugin.h +++ b/src/BlockchainPlugin.h @@ -1,14 +1,38 @@ -#pragma once +#ifndef BLOCKCHAIN_PLUGIN_H +#define BLOCKCHAIN_PLUGIN_H -#include #include +#include +#include // for Q_PLUGIN_METADATA, Q_INTERFACES +#include "BlockchainPluginInterface.h" +#include "LogosViewPluginBase.h" -class BlockchainPlugin : public QObject, public IComponent { +class LogosAPI; +class BlockchainBackend; + +// Thin plugin entry point. Holds a BlockchainBackend and lets the +// generated view-plugin base expose it to ui-host. +class BlockchainPlugin : public QObject, + public BlockchainPluginInterface, + public BlockchainBackendViewPluginBase +{ Q_OBJECT - Q_INTERFACES(IComponent) - Q_PLUGIN_METADATA(IID IComponent_iid FILE "metadata.json") + Q_PLUGIN_METADATA(IID BlockchainPluginInterface_iid FILE "../metadata.json") + Q_INTERFACES(BlockchainPluginInterface) public: - Q_INVOKABLE QWidget* createWidget(LogosAPI* logosAPI = nullptr) override; - void destroyWidget(QWidget* widget) override; + explicit BlockchainPlugin(QObject* parent = nullptr); + ~BlockchainPlugin() override; + + QString name() const override { return "blockchain_ui"; } + QString version() const override { return "1.0.0"; } + + // Called by ui-host after plugin load. Creates the backend and wires + // it up with the provided LogosAPI. + Q_INVOKABLE void initLogos(LogosAPI* api); + +private: + BlockchainBackend* m_backend = nullptr; }; + +#endif // BLOCKCHAIN_PLUGIN_H diff --git a/src/BlockchainPluginInterface.h b/src/BlockchainPluginInterface.h new file mode 100644 index 0000000..cf50ee0 --- /dev/null +++ b/src/BlockchainPluginInterface.h @@ -0,0 +1,19 @@ +#ifndef BLOCKCHAIN_PLUGIN_INTERFACE_H +#define BLOCKCHAIN_PLUGIN_INTERFACE_H + +#include // for Q_DECLARE_INTERFACE +#include "interface.h" + +// Marker interface used by Qt's plugin loader to identify the blockchain UI +// plugin. The actual API surface (Q_INVOKABLE methods, properties, signals) +// lives in BlockchainBackend.rep — this header only carries the IID. +class BlockchainPluginInterface : public PluginInterface +{ +public: + virtual ~BlockchainPluginInterface() = default; +}; + +#define BlockchainPluginInterface_iid "org.logos.BlockchainPluginInterface" +Q_DECLARE_INTERFACE(BlockchainPluginInterface, BlockchainPluginInterface_iid) + +#endif // BLOCKCHAIN_PLUGIN_INTERFACE_H diff --git a/src/blockchain_resources.qrc b/src/blockchain_resources.qrc deleted file mode 100644 index 8fb2392..0000000 --- a/src/blockchain_resources.qrc +++ /dev/null @@ -1,18 +0,0 @@ - - - qml/BlockchainView.qml - qml/views/qmldir - qml/views/StatusConfigView.qml - qml/views/LogsView.qml - qml/views/WalletView.qml - qml/views/GenerateConfigView.qml - qml/views/ConfigChoiceView.qml - qml/views/SetConfigPathView.qml - qml/controls/AccountDelegate.qml - qml/controls/LogosCopyButton.qml - icons/blockchain.png - icons/copy.svg - icons/checkmark.svg - icons/refresh.svg - - diff --git a/src/qml/BlockchainView.qml b/src/qml/BlockchainView.qml index ef1200a..9816083 100644 --- a/src/qml/BlockchainView.qml +++ b/src/qml/BlockchainView.qml @@ -2,91 +2,160 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts -import BlockchainBackend import Logos.Theme +// BlockchainStatus enum (NotStarted/Starting/Running/.../ErrorSubscribeFailed) +// declared in BlockchainBackend.rep — registered with QML by the replica +// factory plugin. +import Logos.BlockchainBackend 1.0 import "views" Rectangle { id: root + readonly property var backend: logos.module("blockchain_ui") + // `ready` can't be a binding on logos.isViewModuleReady(): that's a + // Q_INVOKABLE method, not a Q_PROPERTY, so the binding wouldn't refresh + // when the replica transitions to Valid. Drive it from the bridge's + // viewModuleReadyChanged signal instead. + property bool ready: false + + Connections { + target: logos + function onViewModuleReadyChanged(moduleName, isReady) { + if (moduleName === "blockchain_ui") + root.ready = isReady && root.backend !== null + } + } + + Component.onCompleted: { + // Cover the case where the replica is already Valid by the time + // we attach the Connections handler. + root.ready = root.backend !== null && logos.isViewModuleReady("blockchain_ui") + } + + // Models live on the C++ backend and are auto-remoted by ui-host as + // "/". QML acquires them via logos.model(...). + readonly property var accountsModel: logos.model("blockchain_ui", "accounts") + readonly property var logModel: logos.model("blockchain_ui", "logs") + QtObject { id: _d - function getStatusString(status) { - switch(status) { - case BlockchainBackend.NotStarted: return qsTr("Not Started"); - case BlockchainBackend.Starting: return qsTr("Starting..."); - case BlockchainBackend.Running: return qsTr("Running"); - case BlockchainBackend.Stopping: return qsTr("Stopping..."); - case BlockchainBackend.Stopped: return qsTr("Stopped"); - case BlockchainBackend.Error: return qsTr("Error"); - case BlockchainBackend.ErrorNotInitialized: return qsTr("Error: Module not initialized"); - case BlockchainBackend.ErrorConfigMissing: return qsTr("Error: Config path missing"); - case BlockchainBackend.ErrorStartFailed: return qsTr("Error: Failed to start node"); - case BlockchainBackend.ErrorStopFailed: return qsTr("Error: Failed to stop node"); - case BlockchainBackend.ErrorSubscribeFailed: return qsTr("Error: Failed to subscribe to events"); - default: return qsTr("Unknown"); + function getStatusString(s) { + switch(s) { + case BlockchainBackend.NotStarted: return qsTr("Not Started") + case BlockchainBackend.Starting: return qsTr("Starting...") + case BlockchainBackend.Running: return qsTr("Running") + case BlockchainBackend.Stopping: return qsTr("Stopping...") + case BlockchainBackend.Stopped: return qsTr("Stopped") + case BlockchainBackend.Error: return qsTr("Error") + case BlockchainBackend.ErrorNotInitialized: return qsTr("Error: Module not initialized") + case BlockchainBackend.ErrorConfigMissing: return qsTr("Error: Config path missing") + case BlockchainBackend.ErrorStartFailed: return qsTr("Error: Failed to start node") + case BlockchainBackend.ErrorStopFailed: return qsTr("Error: Failed to stop node") + case BlockchainBackend.ErrorSubscribeFailed: return qsTr("Error: Failed to subscribe to events") + default: return qsTr("Unknown") } } - function getStatusColor(status) { - switch(status) { - case BlockchainBackend.Running: return Theme.palette.success; - case BlockchainBackend.Starting: return Theme.palette.warning; - case BlockchainBackend.Stopping: return Theme.palette.warning; - case BlockchainBackend.NotStarted: return Theme.palette.error; - case BlockchainBackend.Stopped: return Theme.palette.error; - case BlockchainBackend.Error: - case BlockchainBackend.ErrorNotInitialized: - case BlockchainBackend.ErrorConfigMissing: - case BlockchainBackend.ErrorStartFailed: - case BlockchainBackend.ErrorStopFailed: - case BlockchainBackend.ErrorSubscribeFailed: return Theme.palette.error; - default: return Theme.palette.textSecondary; + function getStatusColor(s) { + switch(s) { + case BlockchainBackend.Running: return Theme.palette.success + case BlockchainBackend.Starting: + case BlockchainBackend.Stopping: return Theme.palette.warning + default: return Theme.palette.error } } - property int currentPage: 0 // 0 = config choice (page 1), 1 = node + wallet + logs (page 2) + property int currentPage: 0 } color: Theme.palette.background + // Loading state before backend connects + ColumnLayout { + anchors.centerIn: parent + visible: !root.ready + spacing: 12 + Text { + Layout.alignment: Qt.AlignHCenter + text: qsTr("Connecting to blockchain backend...") + color: Theme.palette.textSecondary + font.pixelSize: Theme.typography.secondaryText + } + BusyIndicator { Layout.alignment: Qt.AlignHCenter; running: !root.ready } + } + StackLayout { anchors.fill: parent anchors.margins: Theme.spacing.large currentIndex: _d.currentPage + visible: root.ready - // Page 1: Config choice (Option 1: Generate own config, Option 2: Set path to configs) + // Page 1: Config choice ScrollView { id: configChoiceScrollView clip: true ConfigChoiceView { id: configChoiceView width: configChoiceScrollView.availableWidth - userConfigPath: backend.userConfig - deploymentConfigPath: backend.deploymentConfig - generatedUserConfigPath: backend.generatedUserConfigPath - onUserConfigPathSelected: function(path) { backend.userConfig = path } - onDeploymentConfigPathSelected: function(path) { backend.deploymentConfig = path } + userConfigPath: root.backend ? root.backend.userConfig : "" + deploymentConfigPath: root.backend ? root.backend.deploymentConfig : "" + generatedUserConfigPath: root.backend ? root.backend.generatedUserConfigPath : "" + onUserConfigPathSelected: function(path) { + if (root.backend) root.backend.userConfig = path + } + onDeploymentConfigPathSelected: function(path) { + if (root.backend) root.backend.deploymentConfig = path + } onSetPathToConfigsRequested: function() { - backend.useGeneratedConfig = false + if (root.backend) root.backend.useGeneratedConfig = false _d.currentPage = 1 } onGenerateRequested: function(outputPath, initialPeers, netPort, blendPort, httpAddr, externalAddress, noPublicIpCheck, deploymentMode, deploymentConfigPath, statePath) { + if (!root.backend) return + console.log("[BlockchainView] generateRequested: outputPath=", outputPath, + "initialPeers=", JSON.stringify(initialPeers), + "netPort=", netPort, "blendPort=", blendPort, + "httpAddr=", httpAddr, "externalAddress=", externalAddress, + "noPublicIpCheck=", noPublicIpCheck, "deploymentMode=", deploymentMode, + "deploymentConfigPath=", deploymentConfigPath, "statePath=", statePath) configChoiceView.generateResultSuccess = false configChoiceView.generateResultMessage = "" - var code = backend.generateConfig(outputPath, initialPeers, netPort, blendPort, httpAddr, externalAddress, noPublicIpCheck, deploymentMode, deploymentConfigPath, statePath) - configChoiceView.generateResultSuccess = (code === 0) - configChoiceView.generateResultMessage = code === 0 ? qsTr("Config generated successfully.") : qsTr("Generate failed (code: %1).").arg(code) - if (code === 0) { - backend.userConfig = (outputPath !== "") ? outputPath : backend.generatedUserConfigPath - backend.deploymentConfig = (deploymentMode === 1 && deploymentConfigPath !== "") ? deploymentConfigPath : "" - backend.useGeneratedConfig = true - _d.currentPage = 1 - } + logos.watch( + root.backend.generateConfig( + outputPath, initialPeers, netPort, blendPort, + httpAddr, externalAddress, noPublicIpCheck, + deploymentMode, deploymentConfigPath, statePath), + function(code) { + // logos.watch stringifies the returned int — coerce back. + var rc = parseInt(code, 10) + console.log("[BlockchainView] generateConfig success callback: code=", code, "type=", typeof code, "→ rc=", rc) + configChoiceView.generateResultSuccess = (rc === 0) + configChoiceView.generateResultMessage = + rc === 0 + ? qsTr("Config generated successfully.") + : qsTr("Generate failed (code: %1).").arg(rc) + if (rc === 0) { + root.backend.userConfig = (outputPath !== "") + ? outputPath : root.backend.generatedUserConfigPath + root.backend.deploymentConfig = + (deploymentMode === 1 && deploymentConfigPath !== "") + ? deploymentConfigPath : "" + root.backend.useGeneratedConfig = true + _d.currentPage = 1 + } + }, + function(error) { + console.log("[BlockchainView] generateConfig error callback: error=", error) + configChoiceView.generateResultSuccess = false + configChoiceView.generateResultMessage = + qsTr("Generate failed: %1").arg(error) + } + ) } } } - // Page 2: Start node, balances, transfer, logs + // Page 2: Node control, wallet, logs SplitView { orientation: Qt.Vertical @@ -97,39 +166,61 @@ Rectangle { StatusConfigView { Layout.fillWidth: true - statusText: _d.getStatusString(backend.status) - statusColor: _d.getStatusColor(backend.status) - userConfig: backend.userConfig - deploymentConfig: backend.deploymentConfig - useGeneratedConfig: backend.useGeneratedConfig - canStart: !!backend.userConfig - && backend.status !== BlockchainBackend.Starting - && backend.status !== BlockchainBackend.Stopping - isRunning: backend.status === BlockchainBackend.Running + statusText: root.backend + ? _d.getStatusString(root.backend.status) + : qsTr("Not Connected") + statusColor: root.backend + ? _d.getStatusColor(root.backend.status) + : Theme.palette.error + userConfig: root.backend ? root.backend.userConfig : "" + deploymentConfig: root.backend ? root.backend.deploymentConfig : "" + useGeneratedConfig: root.backend ? root.backend.useGeneratedConfig : false + canStart: root.backend + && !!root.backend.userConfig + && root.backend.status !== BlockchainBackend.Starting + && root.backend.status !== BlockchainBackend.Stopping + isRunning: root.backend + ? root.backend.status === BlockchainBackend.Running + : false - onStartRequested: backend.startBlockchain() - onStopRequested: backend.stopBlockchain() + onStartRequested: if (root.backend) root.backend.startBlockchain() + onStopRequested: if (root.backend) root.backend.stopBlockchain() onChangeConfigRequested: _d.currentPage = 0 } WalletView { id: walletView - accountsModel: backend.accountsModel + accountsModel: root.accountsModel onGetBalanceRequested: function(addressHex) { - var result = backend.getBalance(addressHex) - if ((result || "").indexOf("Error") === 0) { - lastBalanceErrorAddress = addressHex - lastBalanceError = result - } - else { - lastBalanceErrorAddress = "" - lastBalanceError = "" - } + if (!root.backend) return + logos.watch( + root.backend.getBalance(addressHex), + function(result) { + if ((result || "").indexOf("Error") === 0) { + walletView.lastBalanceErrorAddress = addressHex + walletView.lastBalanceError = result + } else { + walletView.lastBalanceErrorAddress = "" + walletView.lastBalanceError = "" + } + }, + function(error) { + walletView.lastBalanceErrorAddress = addressHex + walletView.lastBalanceError = "Error: " + error + } + ) + } + onCopyToClipboard: (text) => { + if (root.backend) root.backend.copyToClipboard(text) } - onCopyToClipboard: (text) => backend.copyToClipboard(text) onTransferRequested: function(fromKeyHex, toKeyHex, amount) { - walletView.setTransferResult(backend.transferFunds(fromKeyHex, toKeyHex, amount)) + if (!root.backend) return + logos.watch( + root.backend.transferFunds(fromKeyHex, toKeyHex, amount), + function(result) { walletView.setTransferResult(result) }, + function(error) { walletView.setTransferResult("Error: " + error) } + ) } } @@ -142,11 +233,12 @@ Rectangle { SplitView.fillWidth: true SplitView.minimumHeight: 150 - logModel: backend.logModel - onClearRequested: backend.clearLogs() - onCopyToClipboard: (text) => backend.copyToClipboard(text) + logModel: root.logModel + onClearRequested: if (root.backend) root.backend.clearLogs() + onCopyToClipboard: (text) => { + if (root.backend) root.backend.copyToClipboard(text) + } } } } - } diff --git a/src/qml/controls/AccountDelegate.qml b/src/qml/controls/AccountDelegate.qml index 64cfbfd..ff9ad9b 100644 --- a/src/qml/controls/AccountDelegate.qml +++ b/src/qml/controls/AccountDelegate.qml @@ -50,7 +50,7 @@ ItemDelegate { Layout.preferredWidth: 40 display: AbstractButton.IconOnly flat: true - icon.source: "qrc:/icons/refresh.svg" + icon.source: Qt.resolvedUrl("../icons/refresh.svg") icon.color: Theme.palette.textSecondary font.pixelSize: Theme.typography.secondaryText padding: 4 diff --git a/src/qml/controls/LogosCopyButton.qml b/src/qml/controls/LogosCopyButton.qml index 3a29cb5..9532250 100644 --- a/src/qml/controls/LogosCopyButton.qml +++ b/src/qml/controls/LogosCopyButton.qml @@ -1,6 +1,8 @@ import QtQuick import QtQuick.Controls +import Logos.Theme + Button { id: root @@ -11,7 +13,7 @@ Button { display: AbstractButton.IconOnly flat: true - property string iconSource: "qrc:/icons/copy.svg" + property string iconSource: Qt.resolvedUrl("../icons/copy.svg") icon.source: root.iconSource icon.width: 24 @@ -19,7 +21,7 @@ Button { icon.color: Theme.palette.textSecondary function reset() { - iconSource = "qrc:/icons/copy.svg" + iconSource = Qt.resolvedUrl("../icons/copy.svg") } Timer { @@ -31,7 +33,7 @@ Button { onClicked: { root.copyText() - root.iconSource = "qrc:/icons/checkmark.svg" + root.iconSource = Qt.resolvedUrl("../icons/checkmark.svg") resetTimer.restart() } } diff --git a/src/icons/checkmark.svg b/src/qml/icons/checkmark.svg similarity index 100% rename from src/icons/checkmark.svg rename to src/qml/icons/checkmark.svg diff --git a/src/icons/copy.svg b/src/qml/icons/copy.svg similarity index 100% rename from src/icons/copy.svg rename to src/qml/icons/copy.svg diff --git a/src/icons/refresh.svg b/src/qml/icons/refresh.svg similarity index 100% rename from src/icons/refresh.svg rename to src/qml/icons/refresh.svg diff --git a/src/qml/views/ConfigChoiceView.qml b/src/qml/views/ConfigChoiceView.qml index 83915e3..8c4fbd0 100644 --- a/src/qml/views/ConfigChoiceView.qml +++ b/src/qml/views/ConfigChoiceView.qml @@ -85,17 +85,13 @@ ColumnLayout { resultSuccess: root.generateResultSuccess resultMessage: root.generateResultMessage Layout.fillWidth: true - onGenerateRequested: root.generateRequested( - outputPath, - initialPeers, - netPort, - blendPort, - httpAddr, - externalAddress, - noPublicIpCheck, - deploymentMode, - deploymentConfigPath, - statePath) + onGenerateRequested: function(outputPath, initialPeers, netPort, blendPort, + httpAddr, externalAddress, noPublicIpCheck, + deploymentMode, deploymentConfigPath, statePath) { + root.generateRequested(outputPath, initialPeers, netPort, blendPort, + httpAddr, externalAddress, noPublicIpCheck, + deploymentMode, deploymentConfigPath, statePath) + } } } } diff --git a/src/qml/views/GenerateConfigView.qml b/src/qml/views/GenerateConfigView.qml index 41e47aa..5adb508 100644 --- a/src/qml/views/GenerateConfigView.qml +++ b/src/qml/views/GenerateConfigView.qml @@ -210,7 +210,7 @@ ColumnLayout { FileDialog { id: deploymentConfigFileDialog modality: Qt.NonModal - nameFilters: ["YAML files (*.yaml)", "All files (*)"] + nameFilters: ["YAML files (*.yaml *.yml)", "All files (*)"] currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0] onAccepted: customDeploymentField.text = selectedFile } diff --git a/src/qml/views/LogsView.qml b/src/qml/views/LogsView.qml index a453bfa..3ed4d18 100644 --- a/src/qml/views/LogsView.qml +++ b/src/qml/views/LogsView.qml @@ -9,7 +9,7 @@ Control { id: root // --- Public API --- - required property var logModel // LogModel (QAbstractListModel with "text" role) + required property var logModel // ListModel with "text" role signal clearRequested() signal copyToClipboard(string text) @@ -61,6 +61,12 @@ Control { model: root.logModel spacing: 2 + // Auto-scroll to the latest log on insert. Use the ListView's + // own `count` (it's always available and emits countChanged) — + // the model replica is a QAbstractItemModelReplica and does + // not carry the source-side `count` Q_PROPERTY through QtRO. + onCountChanged: if (count > 0) positionViewAtEnd() + delegate: ItemDelegate{ width: ListView.view.width contentItem: LogosText { @@ -76,20 +82,15 @@ Control { } LogosText { - visible: !root.logModel || root.logModel.count === 0 + // ListView's `count` reflects the model row count and has + // a NOTIFY signal — using it here gives the binding + // automatic refresh, unlike `root.logModel.count`. + visible: logsListView.count === 0 anchors.centerIn: parent text: qsTr("No logs yet...") font.pixelSize: Theme.typography.secondaryText color: Theme.palette.textSecondary } - - Connections { - target: root.logModel - function onCountChanged() { - if (root.logModel.count > 0) - logsListView.positionViewAtEnd() - } - } } } } diff --git a/src/qml/views/SetConfigPathView.qml b/src/qml/views/SetConfigPathView.qml index 2fc797f..c7c8f42 100644 --- a/src/qml/views/SetConfigPathView.qml +++ b/src/qml/views/SetConfigPathView.qml @@ -78,14 +78,14 @@ ColumnLayout { FileDialog { id: userConfigFileDialog modality: Qt.NonModal - nameFilters: ["YAML files (*.yaml)"] + nameFilters: ["YAML files (*.yaml *.yml)", "All files (*)"] onAccepted: root.userConfigPathSelected(selectedFile) } FileDialog { id: deploymentConfigFileDialog modality: Qt.NonModal - nameFilters: ["YAML files (*.yaml)"] + nameFilters: ["YAML files (*.yaml *.yml)", "All files (*)"] onAccepted: root.deploymentConfigPathSelected(selectedFile) } }