From 4be74102832a47c467ccaff98e4b9b89f2007449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex?= Date: Wed, 17 Jun 2026 15:46:38 +0000 Subject: [PATCH 1/3] chore(dependencies): Update with config generation fixes (#34) * Update flake. * Update with config generation fixes. * Update flake. * Add int return type fixes. * fix wrong type in tests. --- flake.lock | 8 +- flake.nix | 4 +- src/logos_blockchain_module.cpp | 129 +++++++++++++++----------------- src/logos_blockchain_module.h | 18 ++--- tests/stubs/logos_blockchain.h | 16 +--- tests/test_blockchain.cpp | 51 ++++++------- 6 files changed, 104 insertions(+), 122 deletions(-) diff --git a/flake.lock b/flake.lock index 3a0e27f..88088d4 100644 --- a/flake.lock +++ b/flake.lock @@ -24,16 +24,16 @@ "rust-rapidsnark": "rust-rapidsnark" }, "locked": { - "lastModified": 1781525456, - "narHash": "sha256-SOH9dY1Jg8JmfqMWMZ9YzbGQgWL+ifJ4z+8tHW/4zWs=", + "lastModified": 1781613030, + "narHash": "sha256-kJZ8N/FeJBZRyRtP5JlXVf9zczOPrsBJW17mAsJdKeo=", "owner": "logos-blockchain", "repo": "logos-blockchain", - "rev": "4efdf816e2a3d1447096c3f64c9e230769eb4ecb", + "rev": "3dc81b4ec49ba977220f3ff432885258265aa986", "type": "github" }, "original": { "owner": "logos-blockchain", - "ref": "4efdf816e2a3d1447096c3f64c9e230769eb4ecb", + "ref": "3dc81b4ec49ba977220f3ff432885258265aa986", "repo": "logos-blockchain", "type": "github" } diff --git a/flake.nix b/flake.nix index aad4675..7fc49a3 100644 --- a/flake.nix +++ b/flake.nix @@ -3,8 +3,8 @@ inputs = { logos-module-builder.url = "github:logos-co/logos-module-builder"; - # v0.1.3-rc.10-compatible + rust-rapidsnark nix fixes + cli commands + leader_claim C binding - logos-blockchain.url = "github:logos-blockchain/logos-blockchain?ref=4efdf816e2a3d1447096c3f64c9e230769eb4ecb"; + # v0.1.3-rc.10-compatible + rust-rapidsnark nix fixes + cli commands + leader_claim C binding + config generation fixes + logos-blockchain.url = "github:logos-blockchain/logos-blockchain?ref=3dc81b4ec49ba977220f3ff432885258265aa986"; }; outputs = inputs@{ logos-module-builder, ... }: diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index 1dbe22f..bfbe09c 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -82,10 +82,10 @@ namespace { uint16_t blend_port_val; std::string http_addr_data; std::string external_address_data; - bool no_public_ip_check_val; - std::string custom_deployment_config_path_data; - Deployment deployment_val{}; std::string state_path_data; + bool ibd_val; + std::string log_filter_data; + std::string kms_file_data; // The FFI struct with pointers into owned data GenerateConfigArgs ffi_args{}; @@ -150,39 +150,6 @@ namespace { ffi_args.external_address = nullptr; } - // no_public_ip_check (bool -> const bool*) - if (args.contains("no_public_ip_check") && args["no_public_ip_check"].is_boolean()) { - no_public_ip_check_val = args["no_public_ip_check"].get(); - ffi_args.no_public_ip_check = &no_public_ip_check_val; - } else { - ffi_args.no_public_ip_check = nullptr; - } - - // deployment (const struct Deployment*) - // Expected format: { "deployment": { "well_known_deployment": "devnet" } } - // OR: { "deployment": { "config_path": "/path/to/config" } } - if (args.contains("deployment") && args["deployment"].is_object()) { - const auto& deployment = args["deployment"]; - - if (deployment.contains("well_known_deployment") && deployment["well_known_deployment"].is_string()) { - deployment_val.deployment_type = DeploymentType::WellKnown; - const std::string wellknown = deployment["well_known_deployment"].get(); - if (wellknown == "devnet") { - deployment_val.well_known_deployment = WellKnownDeployment::Devnet; - } - deployment_val.custom_deployment_config_path = nullptr; - } else if (deployment.contains("config_path") && deployment["config_path"].is_string()) { - deployment_val.deployment_type = DeploymentType::Custom; - deployment_val.well_known_deployment = static_cast(0); - custom_deployment_config_path_data = deployment["config_path"].get(); - deployment_val.custom_deployment_config_path = custom_deployment_config_path_data.c_str(); - } - - ffi_args.deployment = &deployment_val; - } else { - ffi_args.deployment = nullptr; - } - // state_path (string -> const char*) if (args.contains("state_path") && args["state_path"].is_string()) { state_path_data = args["state_path"].get(); @@ -190,6 +157,30 @@ namespace { } else { ffi_args.state_path = nullptr; } + + // ibd (bool -> const bool*) + if (args.contains("ibd") && args["ibd"].is_boolean()) { + ibd_val = args["ibd"].get(); + ffi_args.ibd = &ibd_val; + } else { + ffi_args.ibd = nullptr; + } + + // log_filter (string -> const char*) + if (args.contains("log_filter") && args["log_filter"].is_string()) { + log_filter_data = args["log_filter"].get(); + ffi_args.log_filter = log_filter_data.c_str(); + } else { + ffi_args.log_filter = nullptr; + } + + // kms_file (string -> const char*) + if (args.contains("kms_file") && args["kms_file"].is_string()) { + kms_file_data = args["kms_file"].get(); + ffi_args.kms_file = kms_file_data.c_str(); + } else { + ffi_args.kms_file = nullptr; + } } }; } // namespace @@ -247,13 +238,13 @@ LogosBlockchainModule::~LogosBlockchainModule() { // Lifecycle -int LogosBlockchainModule::generate_user_config(const std::string& json_args) { +std::string LogosBlockchainModule::generate_user_config(const std::string& json_args) { json parsed_args; try { parsed_args = json::parse(json_args); } catch (const json::parse_error& e) { fprintf(stderr, "Failed to parse JSON args: %s\n", e.what()); - return 1; + return "1"; } const OwnedGenerateConfigArgs owned_args(parsed_args); @@ -261,16 +252,16 @@ int LogosBlockchainModule::generate_user_config(const std::string& json_args) { const OperationStatus status = ::generate_user_config(owned_args.ffi_args); if (!is_ok(&status)) { fprintf(stderr, "Failed to generate user config. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } -int LogosBlockchainModule::start(const std::string& config_path, const std::string& deployment) { +std::string LogosBlockchainModule::start(const std::string& config_path, const std::string& deployment) { if (node) { fprintf(stderr, "Could not execute the operation: The node is already running.\n"); - return 1; + return "1"; } const char* module_path_env = std::getenv("LOGOS_MODULE_PATH"); @@ -289,7 +280,7 @@ int LogosBlockchainModule::start(const std::string& config_path, const std::stri fprintf(stderr, "Using config from LB_CONFIG_PATH: %s\n", effective_config_path.c_str()); } else { fprintf(stderr, "Config path was not specified and LB_CONFIG_PATH is not set.\n"); - return 3; + return "3"; } } @@ -303,7 +294,7 @@ int LogosBlockchainModule::start(const std::string& config_path, const std::stri fprintf(stderr, "Start node returned with value and error.\n"); if (!is_ok(&error)) { fprintf(stderr, "Failed to start the node. Error: %d\n", error); - return 4; + return "4"; } node = value; @@ -311,23 +302,23 @@ int LogosBlockchainModule::start(const std::string& config_path, const std::stri if (!node) { fprintf(stderr, "Could not subscribe to block events: The node is not running.\n"); - return 4; + return "4"; } s_instance = this; const OperationStatus subscribe_status = subscribe_to_new_blocks(node, on_new_block_callback); if (!is_ok(&subscribe_status)) { fprintf(stderr, "Failed to subscribe to new blocks. Error: %d\n", subscribe_status); - return 5; + return "5"; } - return 0; + return "0"; } -int LogosBlockchainModule::stop() { +std::string LogosBlockchainModule::stop() { if (!node) { fprintf(stderr, "Could not execute the operation: The node is not running.\n"); - return 1; + return "1"; } s_instance = nullptr; @@ -340,36 +331,36 @@ int LogosBlockchainModule::stop() { } node = nullptr; - return 0; + return "0"; } // Config management -int LogosBlockchainModule::update_user_config(const std::string& user_config_path, const std::string& keystore_path) { +std::string LogosBlockchainModule::update_user_config(const std::string& user_config_path, const std::string& keystore_path) { const std::string config = localPathFromFileUrl(user_config_path); const std::string keystore = localPathFromFileUrl(keystore_path); const OperationStatus status = ::update_user_config(config.c_str(), keystore.c_str()); if (!is_ok(&status)) { fprintf(stderr, "Failed to update user config. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } -int LogosBlockchainModule::migrate_user_config(const std::string& output_path, const std::string& keystore_path) { +std::string LogosBlockchainModule::migrate_user_config(const std::string& output_path, const std::string& keystore_path) { const std::string output = localPathFromFileUrl(output_path); const std::string keystore = localPathFromFileUrl(keystore_path); const OperationStatus status = ::migrate_user_config(output.c_str(), keystore.c_str()); if (!is_ok(&status)) { fprintf(stderr, "Failed to migrate user config. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } -int LogosBlockchainModule::migrate_user_config_0_1_2( +std::string LogosBlockchainModule::migrate_user_config_0_1_2( const std::string& new_config_path, const std::string& old_config_path, const std::string& keystore_path @@ -382,12 +373,12 @@ int LogosBlockchainModule::migrate_user_config_0_1_2( ::migrate_user_config_0_1_2(new_config.c_str(), old_config.c_str(), keystore.c_str()); if (!is_ok(&status)) { fprintf(stderr, "Failed to migrate 0.1.2 config. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } -int LogosBlockchainModule::participate( +std::string LogosBlockchainModule::participate( const std::string& config_path, const std::string& keystore_path, const std::string& output_dir, @@ -402,9 +393,9 @@ int LogosBlockchainModule::participate( ::participate(config.c_str(), keystore.c_str(), output.c_str(), external_address_ptr); if (!is_ok(&status)) { fprintf(stderr, "Failed to generate participation data. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } // Keystore @@ -438,7 +429,7 @@ std::string LogosBlockchainModule::generate_key( return result; } -int LogosBlockchainModule::add_key( +std::string LogosBlockchainModule::add_key( const std::string& user_config_path, const std::string& keystore_path, const std::string& key_type, @@ -448,7 +439,7 @@ int LogosBlockchainModule::add_key( KeyType type{}; if (!parse_key_type(key_type, type)) { fprintf(stderr, "Invalid key_type (expected \"ed25519\" or \"zk\").\n"); - return 1; + return "1"; } const std::string config = localPathFromFileUrl(user_config_path); @@ -459,12 +450,12 @@ int LogosBlockchainModule::add_key( ::add_key(config.c_str(), keystore.c_str(), type, key_hex.c_str(), key_title_ptr); if (!is_ok(&status)) { fprintf(stderr, "Failed to add key. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } -int LogosBlockchainModule::remove_key( +std::string LogosBlockchainModule::remove_key( const std::string& user_config_path, const std::string& keystore_path, const std::string& key_title @@ -475,9 +466,9 @@ int LogosBlockchainModule::remove_key( const OperationStatus status = ::remove_key(config.c_str(), keystore.c_str(), key_title.c_str()); if (!is_ok(&status)) { fprintf(stderr, "Failed to remove key. Error: %d\n", status); - return 1; + return "1"; } - return 0; + return "0"; } // Identity diff --git a/src/logos_blockchain_module.h b/src/logos_blockchain_module.h index 9ebde0d..cb4ba91 100644 --- a/src/logos_blockchain_module.h +++ b/src/logos_blockchain_module.h @@ -22,19 +22,19 @@ public: // ---- Node ---- // Lifecycle - int generate_user_config(const std::string& json_args); - int start(const std::string& config_path, const std::string& deployment); - int stop(); + std::string generate_user_config(const std::string& json_args); + std::string start(const std::string& config_path, const std::string& deployment); + std::string stop(); // Config management - int update_user_config(const std::string& user_config_path, const std::string& keystore_path); - int migrate_user_config(const std::string& output_path, const std::string& keystore_path); - int migrate_user_config_0_1_2( + std::string update_user_config(const std::string& user_config_path, const std::string& keystore_path); + std::string migrate_user_config(const std::string& output_path, const std::string& keystore_path); + std::string migrate_user_config_0_1_2( const std::string& new_config_path, const std::string& old_config_path, const std::string& keystore_path ); - int participate( + std::string participate( const std::string& config_path, const std::string& keystore_path, const std::string& output_dir, @@ -49,14 +49,14 @@ public: const std::string& key_type, const std::string& key_title ); - int add_key( + std::string add_key( const std::string& user_config_path, const std::string& keystore_path, const std::string& key_type, const std::string& key_hex, const std::string& key_title ); - int remove_key( + std::string remove_key( const std::string& user_config_path, const std::string& keystore_path, const std::string& key_title diff --git a/tests/stubs/logos_blockchain.h b/tests/stubs/logos_blockchain.h index 7455a95..10f2889 100644 --- a/tests/stubs/logos_blockchain.h +++ b/tests/stubs/logos_blockchain.h @@ -23,23 +23,12 @@ typedef struct LogosBlockchainNode LogosBlockchainNode; // Operation status (0 = OK) typedef int OperationStatus; -// Deployment enums -typedef enum { WellKnown, Custom } DeploymentType; -typedef enum { Devnet } WellKnownDeployment; - // Consensus state enum typedef enum { Bootstrapping, Online } State; // Key type for generate_key / add_key typedef enum { Ed25519, Zk } KeyType; -// Deployment configuration -typedef struct { - DeploymentType deployment_type; - WellKnownDeployment well_known_deployment; - const char* custom_deployment_config_path; -} Deployment; - // Arguments for generate_user_config typedef struct { const char** initial_peers; @@ -49,9 +38,10 @@ typedef struct { const uint16_t* blend_port; const char* http_addr; const char* external_address; - const bool* no_public_ip_check; - const Deployment* deployment; const char* state_path; + const bool* ibd; + const char* log_filter; + const char* kms_file; } GenerateConfigArgs; // Arguments for transfer_funds diff --git a/tests/test_blockchain.cpp b/tests/test_blockchain.cpp index a9ad982..4156c0d 100644 --- a/tests/test_blockchain.cpp +++ b/tests/test_blockchain.cpp @@ -59,8 +59,8 @@ static LogosBlockchainModule* createStartedModule(LogosTestContext& t, TempDir& t.mockCFunction("start_lb_node").returns(1); t.mockCFunction("subscribe_to_new_blocks").returns(0); - int rc = module->start(tmpDir.filePath("config.json"), ""); - if (rc != 0) { + std::string rc = module->start(tmpDir.filePath("config.json"), ""); + if (rc != "0") { delete module; return nullptr; } @@ -77,7 +77,7 @@ LOGOS_TEST(generate_user_config_returns_0_on_success) { t.mockCFunction("generate_user_config").returns(0); - LOGOS_ASSERT_EQ(module.generate_user_config(R"({"output":"/tmp/test-config.json"})"), 0); + LOGOS_ASSERT_EQ(module.generate_user_config(R"({"output":"/tmp/test-config.json"})"), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("generate_user_config")); } @@ -87,7 +87,7 @@ LOGOS_TEST(generate_user_config_returns_1_on_failure) { t.mockCFunction("generate_user_config").returns(1); - LOGOS_ASSERT_EQ(module.generate_user_config("{}"), 1); + LOGOS_ASSERT_EQ(module.generate_user_config("{}"), std::string("1")); } LOGOS_TEST(generate_user_config_from_json_string) { @@ -96,7 +96,7 @@ LOGOS_TEST(generate_user_config_from_json_string) { t.mockCFunction("generate_user_config").returns(0); - LOGOS_ASSERT_EQ(module.generate_user_config(R"({"output":"/tmp/out.json"})"), 0); + LOGOS_ASSERT_EQ(module.generate_user_config(R"({"output":"/tmp/out.json"})"), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("generate_user_config")); } @@ -113,12 +113,13 @@ LOGOS_TEST(generate_user_config_with_all_fields) { "blend_port": 9001, "http_addr": "0.0.0.0:8080", "external_address": "1.2.3.4", - "no_public_ip_check": true, - "deployment": { "well_known_deployment": "devnet" }, - "state_path": "/tmp/state" + "state_path": "/tmp/state", + "ibd": true, + "log_filter": "warn,logos_blockchain=debug", + "kms_file": "/tmp/kms.yaml" })"; - LOGOS_ASSERT_EQ(module.generate_user_config(args), 0); + LOGOS_ASSERT_EQ(module.generate_user_config(args), std::string("0")); } // ============================================================================ @@ -128,7 +129,7 @@ LOGOS_TEST(generate_user_config_with_all_fields) { LOGOS_TEST(stop_without_node_returns_1) { auto t = LogosTestContext("blockchain_module"); LogosBlockchainModule module; - LOGOS_ASSERT_EQ(module.stop(), 1); + LOGOS_ASSERT_EQ(module.stop(), std::string("1")); } LOGOS_TEST(wallet_get_balance_without_node_returns_error) { @@ -215,7 +216,7 @@ LOGOS_TEST(start_returns_1_when_already_running) { auto* module = createStartedModule(t, tmpDir); LOGOS_ASSERT_TRUE(module != nullptr); - LOGOS_ASSERT_EQ(module->start("/tmp/config.json", ""), 1); + LOGOS_ASSERT_EQ(module->start("/tmp/config.json", ""), std::string("1")); delete module; } @@ -225,7 +226,7 @@ LOGOS_TEST(stop_succeeds_with_running_node) { auto* module = createStartedModule(t, tmpDir); LOGOS_ASSERT_TRUE(module != nullptr); - LOGOS_ASSERT_EQ(module->stop(), 0); + LOGOS_ASSERT_EQ(module->stop(), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("stop_node")); delete module; } @@ -776,7 +777,7 @@ LOGOS_TEST(update_user_config_returns_0_on_success) { t.mockCFunction("update_user_config").returns(0); - LOGOS_ASSERT_EQ(module.update_user_config("/tmp/config.yaml", "/tmp/keystore.yaml"), 0); + LOGOS_ASSERT_EQ(module.update_user_config("/tmp/config.yaml", "/tmp/keystore.yaml"), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("update_user_config")); } @@ -786,7 +787,7 @@ LOGOS_TEST(update_user_config_returns_1_on_failure) { t.mockCFunction("update_user_config").returns(1); - LOGOS_ASSERT_EQ(module.update_user_config("/tmp/config.yaml", "/tmp/keystore.yaml"), 1); + LOGOS_ASSERT_EQ(module.update_user_config("/tmp/config.yaml", "/tmp/keystore.yaml"), std::string("1")); } LOGOS_TEST(migrate_user_config_returns_0_on_success) { @@ -795,7 +796,7 @@ LOGOS_TEST(migrate_user_config_returns_0_on_success) { t.mockCFunction("migrate_user_config").returns(0); - LOGOS_ASSERT_EQ(module.migrate_user_config("/tmp/out.yaml", "/tmp/keystore.yaml"), 0); + LOGOS_ASSERT_EQ(module.migrate_user_config("/tmp/out.yaml", "/tmp/keystore.yaml"), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("migrate_user_config")); } @@ -805,7 +806,7 @@ LOGOS_TEST(migrate_user_config_returns_1_on_failure) { t.mockCFunction("migrate_user_config").returns(1); - LOGOS_ASSERT_EQ(module.migrate_user_config("/tmp/out.yaml", "/tmp/keystore.yaml"), 1); + LOGOS_ASSERT_EQ(module.migrate_user_config("/tmp/out.yaml", "/tmp/keystore.yaml"), std::string("1")); } LOGOS_TEST(migrate_user_config_0_1_2_returns_0_on_success) { @@ -814,7 +815,7 @@ LOGOS_TEST(migrate_user_config_0_1_2_returns_0_on_success) { t.mockCFunction("migrate_user_config_0_1_2").returns(0); - LOGOS_ASSERT_EQ(module.migrate_user_config_0_1_2("/tmp/new.yaml", "/tmp/old.yaml", "/tmp/keystore.yaml"), 0); + LOGOS_ASSERT_EQ(module.migrate_user_config_0_1_2("/tmp/new.yaml", "/tmp/old.yaml", "/tmp/keystore.yaml"), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("migrate_user_config_0_1_2")); } @@ -824,7 +825,7 @@ LOGOS_TEST(migrate_user_config_0_1_2_returns_1_on_failure) { t.mockCFunction("migrate_user_config_0_1_2").returns(1); - LOGOS_ASSERT_EQ(module.migrate_user_config_0_1_2("/tmp/new.yaml", "/tmp/old.yaml", "/tmp/keystore.yaml"), 1); + LOGOS_ASSERT_EQ(module.migrate_user_config_0_1_2("/tmp/new.yaml", "/tmp/old.yaml", "/tmp/keystore.yaml"), std::string("1")); } LOGOS_TEST(participate_returns_0_on_success) { @@ -833,7 +834,7 @@ LOGOS_TEST(participate_returns_0_on_success) { t.mockCFunction("participate").returns(0); - LOGOS_ASSERT_EQ(module.participate("/tmp/config.yaml", "/tmp/keystore.yaml", "/tmp/out", ""), 0); + LOGOS_ASSERT_EQ(module.participate("/tmp/config.yaml", "/tmp/keystore.yaml", "/tmp/out", ""), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("participate")); } @@ -843,7 +844,7 @@ LOGOS_TEST(participate_returns_1_on_failure) { t.mockCFunction("participate").returns(1); - LOGOS_ASSERT_EQ(module.participate("/tmp/config.yaml", "/tmp/keystore.yaml", "/tmp/out", "1.2.3.4"), 1); + LOGOS_ASSERT_EQ(module.participate("/tmp/config.yaml", "/tmp/keystore.yaml", "/tmp/out", "1.2.3.4"), std::string("1")); } // ============================================================================ @@ -900,7 +901,7 @@ LOGOS_TEST(add_key_returns_0_on_success) { t.mockCFunction("add_key").returns(0); - LOGOS_ASSERT_EQ(module.add_key("/tmp/config.yaml", "/tmp/keystore.yaml", "ed25519", VALID_HEX, ""), 0); + LOGOS_ASSERT_EQ(module.add_key("/tmp/config.yaml", "/tmp/keystore.yaml", "ed25519", VALID_HEX, ""), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("add_key")); } @@ -908,7 +909,7 @@ LOGOS_TEST(add_key_rejects_invalid_key_type) { auto t = LogosTestContext("blockchain_module"); LogosBlockchainModule module; - LOGOS_ASSERT_EQ(module.add_key("/tmp/config.yaml", "/tmp/keystore.yaml", "bogus", VALID_HEX, ""), 1); + LOGOS_ASSERT_EQ(module.add_key("/tmp/config.yaml", "/tmp/keystore.yaml", "bogus", VALID_HEX, ""), std::string("1")); LOGOS_ASSERT_FALSE(t.cFunctionCalled("add_key")); } @@ -918,7 +919,7 @@ LOGOS_TEST(add_key_returns_1_on_failure) { t.mockCFunction("add_key").returns(1); - LOGOS_ASSERT_EQ(module.add_key("/tmp/config.yaml", "/tmp/keystore.yaml", "zk", VALID_HEX, "title"), 1); + LOGOS_ASSERT_EQ(module.add_key("/tmp/config.yaml", "/tmp/keystore.yaml", "zk", VALID_HEX, "title"), std::string("1")); } LOGOS_TEST(remove_key_returns_0_on_success) { @@ -927,7 +928,7 @@ LOGOS_TEST(remove_key_returns_0_on_success) { t.mockCFunction("remove_key").returns(0); - LOGOS_ASSERT_EQ(module.remove_key("/tmp/config.yaml", "/tmp/keystore.yaml", "my-key"), 0); + LOGOS_ASSERT_EQ(module.remove_key("/tmp/config.yaml", "/tmp/keystore.yaml", "my-key"), std::string("0")); LOGOS_ASSERT(t.cFunctionCalled("remove_key")); } @@ -937,7 +938,7 @@ LOGOS_TEST(remove_key_returns_1_on_failure) { t.mockCFunction("remove_key").returns(1); - LOGOS_ASSERT_EQ(module.remove_key("/tmp/config.yaml", "/tmp/keystore.yaml", "my-key"), 1); + LOGOS_ASSERT_EQ(module.remove_key("/tmp/config.yaml", "/tmp/keystore.yaml", "my-key"), std::string("1")); } // ============================================================================ From 48c9a88b500364d20dcd742001edd3e8f3e5bc73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex?= Date: Thu, 18 Jun 2026 13:27:11 +0000 Subject: [PATCH 2/3] chore(dependencies): update module builder with header parsing fixes (#41) --- flake.lock | 928 +++++++++++++++++++++++++++++++++++------------------ flake.nix | 2 +- 2 files changed, 614 insertions(+), 316 deletions(-) diff --git a/flake.lock b/flake.lock index 88088d4..c15be9e 100644 --- a/flake.lock +++ b/flake.lock @@ -86,7 +86,7 @@ "logos-cpp-sdk" ], "logos-module": "logos-module_7", - "logos-nix": "logos-nix_16", + "logos-nix": "logos-nix_18", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -115,7 +115,7 @@ "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_4", "logos-module": "logos-module_8", - "logos-nix": "logos-nix_21", + "logos-nix": "logos-nix_23", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -172,7 +172,7 @@ "logos-cpp-sdk" ], "logos-module": "logos-module_13", - "logos-nix": "logos-nix_60", + "logos-nix": "logos-nix_62", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -202,7 +202,7 @@ "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_9", "logos-module": "logos-module_14", - "logos-nix": "logos-nix_65", + "logos-nix": "logos-nix_67", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -232,7 +232,12 @@ }, "logos-cpp-sdk": { "inputs": { + "logos-lidl": "logos-lidl", "logos-nix": "logos-nix", + "logos-protocol": [ + "logos-module-builder", + "logos-protocol" + ], "nixpkgs": [ "logos-module-builder", "logos-cpp-sdk", @@ -241,11 +246,11 @@ ] }, "locked": { - "lastModified": 1780948044, - "narHash": "sha256-LJF2BvGhDCX10tKjwp7FRCFtZgeC/N9egRqIszOqoX0=", + "lastModified": 1781785832, + "narHash": "sha256-f9Q4lmQQ9pKJIEi1zK+R3eggYNb8alygOybMbZPfTFg=", "owner": "logos-co", "repo": "logos-cpp-sdk", - "rev": "40e7631402d2082664a146a9fb9de33cf35cd299", + "rev": "f032cf291e7adc70b13e6a0f7be4d80ca2248f56", "type": "github" }, "original": { @@ -256,7 +261,7 @@ }, "logos-cpp-sdk_10": { "inputs": { - "logos-nix": "logos-nix_66", + "logos-nix": "logos-nix_68", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -286,7 +291,7 @@ }, "logos-cpp-sdk_11": { "inputs": { - "logos-nix": "logos-nix_94", + "logos-nix": "logos-nix_96", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -343,7 +348,7 @@ }, "logos-cpp-sdk_2": { "inputs": { - "logos-nix": "logos-nix_8", + "logos-nix": "logos-nix_10", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -370,7 +375,7 @@ }, "logos-cpp-sdk_3": { "inputs": { - "logos-nix": "logos-nix_17", + "logos-nix": "logos-nix_19", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -398,7 +403,7 @@ }, "logos-cpp-sdk_4": { "inputs": { - "logos-nix": "logos-nix_19", + "logos-nix": "logos-nix_21", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -428,7 +433,7 @@ }, "logos-cpp-sdk_5": { "inputs": { - "logos-nix": "logos-nix_22", + "logos-nix": "logos-nix_24", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -457,7 +462,7 @@ }, "logos-cpp-sdk_6": { "inputs": { - "logos-nix": "logos-nix_50", + "logos-nix": "logos-nix_52", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -482,7 +487,7 @@ }, "logos-cpp-sdk_7": { "inputs": { - "logos-nix": "logos-nix_52", + "logos-nix": "logos-nix_54", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -510,7 +515,7 @@ }, "logos-cpp-sdk_8": { "inputs": { - "logos-nix": "logos-nix_61", + "logos-nix": "logos-nix_63", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -539,7 +544,7 @@ }, "logos-cpp-sdk_9": { "inputs": { - "logos-nix": "logos-nix_63", + "logos-nix": "logos-nix_65", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -570,7 +575,7 @@ }, "logos-design-system": { "inputs": { - "logos-nix": "logos-nix_18", + "logos-nix": "logos-nix_20", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -598,7 +603,7 @@ }, "logos-design-system_2": { "inputs": { - "logos-nix": "logos-nix_51", + "logos-nix": "logos-nix_53", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -623,7 +628,7 @@ }, "logos-design-system_3": { "inputs": { - "logos-nix": "logos-nix_62", + "logos-nix": "logos-nix_64", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -655,7 +660,7 @@ "logos-capability-module": "logos-capability-module_3", "logos-cpp-sdk": "logos-cpp-sdk_5", "logos-module": "logos-module_9", - "logos-nix": "logos-nix_24", + "logos-nix": "logos-nix_26", "logos-package-manager": "logos-package-manager", "nixpkgs": [ "logos-module-builder", @@ -687,7 +692,7 @@ "logos-capability-module": "logos-capability-module_4", "logos-cpp-sdk": "logos-cpp-sdk_11", "logos-module": "logos-module_16", - "logos-nix": "logos-nix_96", + "logos-nix": "logos-nix_98", "logos-package-manager": "logos-package-manager_5", "nixpkgs": [ "logos-module-builder", @@ -717,7 +722,7 @@ "logos-capability-module": "logos-capability-module_6", "logos-cpp-sdk": "logos-cpp-sdk_10", "logos-module": "logos-module_15", - "logos-nix": "logos-nix_68", + "logos-nix": "logos-nix_70", "logos-package-manager": "logos-package-manager_3", "nixpkgs": [ "logos-module-builder", @@ -745,6 +750,64 @@ "type": "github" } }, + "logos-lidl": { + "inputs": { + "logos-nix": [ + "logos-module-builder", + "logos-cpp-sdk", + "logos-nix" + ], + "nixpkgs": [ + "logos-module-builder", + "logos-cpp-sdk", + "logos-lidl", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781653473, + "narHash": "sha256-8l2tE2K5nY1grcFROQHC1By1jVI0NrfkS3k2v2y6R2I=", + "owner": "logos-co", + "repo": "logos-lidl", + "rev": "8c95d4f0cc6a10195c70ed71e85b7a4cddca02f8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-lidl", + "type": "github" + } + }, + "logos-lidl_2": { + "inputs": { + "logos-nix": [ + "logos-module-builder", + "logos-qt-sdk", + "logos-nix" + ], + "nixpkgs": [ + "logos-module-builder", + "logos-qt-sdk", + "logos-lidl", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781653473, + "narHash": "sha256-8l2tE2K5nY1grcFROQHC1By1jVI0NrfkS3k2v2y6R2I=", + "owner": "logos-co", + "repo": "logos-lidl", + "rev": "8c95d4f0cc6a10195c70ed71e85b7a4cddca02f8", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-lidl", + "type": "github" + } + }, "logos-module": { "inputs": { "logos-nix": "logos-nix_2", @@ -756,11 +819,11 @@ ] }, "locked": { - "lastModified": 1780603603, - "narHash": "sha256-CV7R+lwNIP0baXZtE9uNjqu7qDLiANwyGfMkHfTjcl0=", + "lastModified": 1781311603, + "narHash": "sha256-Ym3i52f5MWuZy8Qas3+zfoxz+mxQUsyW+Qol1no6kDs=", "owner": "logos-co", "repo": "logos-module", - "rev": "780894dd40ebc8eded0fa97b1729286f31571cfb", + "rev": "a3e288a71d6f79445db598b0ffcca2ee435596b9", "type": "github" }, "original": { @@ -776,6 +839,9 @@ "logos-nix": "logos-nix_3", "logos-plugin-core": "logos-plugin-core", "logos-plugin-qt": "logos-plugin-qt", + "logos-protocol": "logos-protocol", + "logos-qt-sdk": "logos-qt-sdk", + "logos-rust-sdk": "logos-rust-sdk", "logos-standalone-app": "logos-standalone-app", "logos-test-framework": "logos-test-framework_3", "nix-bundle-lgx": "nix-bundle-lgx_8", @@ -787,15 +853,16 @@ ] }, "locked": { - "lastModified": 1781103441, - "narHash": "sha256-W8PSzZnuNvXHERz90lVDWa4pbE6oJjrKwme1fJggLHU=", + "lastModified": 1781788313, + "narHash": "sha256-FnlpVshUbq0jm5unPjUi/woRBM9wr3a2beVidszbLwM=", "owner": "logos-co", "repo": "logos-module-builder", - "rev": "d5ac0dce2d5420258d584910a83415d79d859d89", + "rev": "bc868bf47f9d797637ac78af814b0db718dde4b8", "type": "github" }, "original": { "owner": "logos-co", + "ref": "bc868bf47f9d797637ac78af814b0db718dde4b8", "repo": "logos-module-builder", "type": "github" } @@ -804,7 +871,7 @@ "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_2", "logos-module": "logos-module_4", - "logos-nix": "logos-nix_10", + "logos-nix": "logos-nix_12", "logos-plugin-core": "logos-plugin-core_2", "logos-plugin-qt": "logos-plugin-qt_2", "logos-standalone-app": "logos-standalone-app_2", @@ -838,7 +905,7 @@ "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_7", "logos-module": "logos-module_10", - "logos-nix": "logos-nix_54", + "logos-nix": "logos-nix_56", "logos-plugin-core": "logos-plugin-core_3", "logos-plugin-qt": "logos-plugin-qt_3", "logos-standalone-app": "logos-standalone-app_3", @@ -871,7 +938,7 @@ }, "logos-module_10": { "inputs": { - "logos-nix": "logos-nix_53", + "logos-nix": "logos-nix_55", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -899,7 +966,7 @@ }, "logos-module_11": { "inputs": { - "logos-nix": "logos-nix_55", + "logos-nix": "logos-nix_57", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -928,7 +995,7 @@ }, "logos-module_12": { "inputs": { - "logos-nix": "logos-nix_57", + "logos-nix": "logos-nix_59", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -957,7 +1024,7 @@ }, "logos-module_13": { "inputs": { - "logos-nix": "logos-nix_59", + "logos-nix": "logos-nix_61", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -987,7 +1054,7 @@ }, "logos-module_14": { "inputs": { - "logos-nix": "logos-nix_64", + "logos-nix": "logos-nix_66", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1018,7 +1085,7 @@ }, "logos-module_15": { "inputs": { - "logos-nix": "logos-nix_67", + "logos-nix": "logos-nix_69", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1048,7 +1115,7 @@ }, "logos-module_16": { "inputs": { - "logos-nix": "logos-nix_95", + "logos-nix": "logos-nix_97", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1124,7 +1191,7 @@ }, "logos-module_4": { "inputs": { - "logos-nix": "logos-nix_9", + "logos-nix": "logos-nix_11", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1151,7 +1218,7 @@ }, "logos-module_5": { "inputs": { - "logos-nix": "logos-nix_11", + "logos-nix": "logos-nix_13", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1179,7 +1246,7 @@ }, "logos-module_6": { "inputs": { - "logos-nix": "logos-nix_13", + "logos-nix": "logos-nix_15", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1207,7 +1274,7 @@ }, "logos-module_7": { "inputs": { - "logos-nix": "logos-nix_15", + "logos-nix": "logos-nix_17", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1236,7 +1303,7 @@ }, "logos-module_8": { "inputs": { - "logos-nix": "logos-nix_20", + "logos-nix": "logos-nix_22", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1266,7 +1333,7 @@ }, "logos-module_9": { "inputs": { - "logos-nix": "logos-nix_23", + "logos-nix": "logos-nix_25", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -1388,11 +1455,11 @@ "nixpkgs": "nixpkgs_106" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1442,11 +1509,11 @@ "nixpkgs": "nixpkgs_109" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1460,11 +1527,11 @@ "nixpkgs": "nixpkgs_110" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1478,11 +1545,11 @@ "nixpkgs": "nixpkgs_111" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1496,11 +1563,11 @@ "nixpkgs": "nixpkgs_112" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1532,11 +1599,11 @@ "nixpkgs": "nixpkgs_113" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1550,11 +1617,11 @@ "nixpkgs": "nixpkgs_114" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1568,11 +1635,11 @@ "nixpkgs": "nixpkgs_115" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1586,11 +1653,11 @@ "nixpkgs": "nixpkgs_116" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1604,11 +1671,11 @@ "nixpkgs": "nixpkgs_117" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1622,11 +1689,11 @@ "nixpkgs": "nixpkgs_118" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1640,11 +1707,11 @@ "nixpkgs": "nixpkgs_119" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1694,11 +1761,11 @@ "nixpkgs": "nixpkgs_122" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1747,6 +1814,42 @@ "inputs": { "nixpkgs": "nixpkgs_124" }, + "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_122": { + "inputs": { + "nixpkgs": "nixpkgs_125" + }, + "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_123": { + "inputs": { + "nixpkgs": "nixpkgs_126" + }, "locked": { "lastModified": 1773955630, "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", @@ -1820,11 +1923,11 @@ "nixpkgs": "nixpkgs_19" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1838,11 +1941,11 @@ "nixpkgs": "nixpkgs_20" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -1874,11 +1977,11 @@ "nixpkgs": "nixpkgs_22" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -1946,11 +2049,11 @@ "nixpkgs": "nixpkgs_25" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2000,11 +2103,11 @@ "nixpkgs": "nixpkgs_28" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2018,11 +2121,11 @@ "nixpkgs": "nixpkgs_29" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2036,11 +2139,11 @@ "nixpkgs": "nixpkgs_30" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2126,11 +2229,11 @@ "nixpkgs": "nixpkgs_34" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2180,11 +2283,11 @@ "nixpkgs": "nixpkgs_37" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2198,11 +2301,11 @@ "nixpkgs": "nixpkgs_38" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2216,11 +2319,11 @@ "nixpkgs": "nixpkgs_39" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2234,11 +2337,11 @@ "nixpkgs": "nixpkgs_40" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2252,11 +2355,11 @@ "nixpkgs": "nixpkgs_41" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2270,11 +2373,11 @@ "nixpkgs": "nixpkgs_42" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2306,11 +2409,11 @@ "nixpkgs": "nixpkgs_43" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2324,11 +2427,11 @@ "nixpkgs": "nixpkgs_44" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2342,11 +2445,11 @@ "nixpkgs": "nixpkgs_45" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2360,11 +2463,11 @@ "nixpkgs": "nixpkgs_46" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2378,11 +2481,11 @@ "nixpkgs": "nixpkgs_47" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2432,11 +2535,11 @@ "nixpkgs": "nixpkgs_50" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2468,11 +2571,11 @@ "nixpkgs": "nixpkgs_52" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2504,11 +2607,11 @@ "nixpkgs": "nixpkgs_53" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2702,11 +2805,11 @@ "nixpkgs": "nixpkgs_63" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2720,11 +2823,11 @@ "nixpkgs": "nixpkgs_64" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2756,11 +2859,11 @@ "nixpkgs": "nixpkgs_66" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2810,11 +2913,11 @@ "nixpkgs": "nixpkgs_69" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2864,11 +2967,11 @@ "nixpkgs": "nixpkgs_72" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -2900,11 +3003,11 @@ "nixpkgs": "nixpkgs_73" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2918,11 +3021,11 @@ "nixpkgs": "nixpkgs_74" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -2990,11 +3093,11 @@ "nixpkgs": "nixpkgs_78" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3044,11 +3147,11 @@ "nixpkgs": "nixpkgs_81" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3062,11 +3165,11 @@ "nixpkgs": "nixpkgs_82" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3098,11 +3201,11 @@ "nixpkgs": "nixpkgs_83" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3116,11 +3219,11 @@ "nixpkgs": "nixpkgs_84" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3134,11 +3237,11 @@ "nixpkgs": "nixpkgs_85" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3152,11 +3255,11 @@ "nixpkgs": "nixpkgs_86" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3170,11 +3273,11 @@ "nixpkgs": "nixpkgs_87" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3188,11 +3291,11 @@ "nixpkgs": "nixpkgs_88" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3206,11 +3309,11 @@ "nixpkgs": "nixpkgs_89" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3224,11 +3327,11 @@ "nixpkgs": "nixpkgs_90" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3242,11 +3345,11 @@ "nixpkgs": "nixpkgs_91" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3278,11 +3381,11 @@ "nixpkgs": "nixpkgs_12" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3314,11 +3417,11 @@ "nixpkgs": "nixpkgs_94" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3350,11 +3453,11 @@ "nixpkgs": "nixpkgs_96" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3368,11 +3471,11 @@ "nixpkgs": "nixpkgs_97" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3422,11 +3525,11 @@ "nixpkgs": "nixpkgs_100" }, "locked": { - "lastModified": 1774455309, - "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", + "lastModified": 1773955630, + "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", "owner": "logos-co", "repo": "logos-nix", - "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", + "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", "type": "github" }, "original": { @@ -3440,11 +3543,11 @@ "nixpkgs": "nixpkgs_101" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3458,11 +3561,11 @@ "nixpkgs": "nixpkgs_102" }, "locked": { - "lastModified": 1773955630, - "narHash": "sha256-KqzMoWYIVp2xMgphs7v02T/BE54RKMFxpdC2duhJKG0=", + "lastModified": 1774455309, + "narHash": "sha256-3AN7aFnArdysrbQQ2UskWzjNSFADb4hDCsnx69Fa0ng=", "owner": "logos-co", "repo": "logos-nix", - "rev": "0e9e6d66ab8eb34f59e45ed448f7dc29130feb88", + "rev": "e637a1f5e871244d1c2df1e3c52a067f2eb406f2", "type": "github" }, "original": { @@ -3473,7 +3576,7 @@ }, "logos-package": { "inputs": { - "logos-nix": "logos-nix_26", + "logos-nix": "logos-nix_28", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3503,7 +3606,7 @@ }, "logos-package-manager": { "inputs": { - "logos-nix": "logos-nix_25", + "logos-nix": "logos-nix_27", "logos-package": "logos-package", "nix-bundle-appimage": "nix-bundle-appimage", "nix-bundle-dir": "nix-bundle-dir_2", @@ -3535,7 +3638,7 @@ }, "logos-package-manager_2": { "inputs": { - "logos-nix": "logos-nix_42", + "logos-nix": "logos-nix_44", "logos-package": "logos-package_4", "nix-bundle-appimage": "nix-bundle-appimage_2", "nix-bundle-dir": "nix-bundle-dir_6", @@ -3566,7 +3669,7 @@ }, "logos-package-manager_3": { "inputs": { - "logos-nix": "logos-nix_69", + "logos-nix": "logos-nix_71", "logos-package": "logos-package_6", "nix-bundle-appimage": "nix-bundle-appimage_3", "nix-bundle-dir": "nix-bundle-dir_9", @@ -3599,7 +3702,7 @@ }, "logos-package-manager_4": { "inputs": { - "logos-nix": "logos-nix_86", + "logos-nix": "logos-nix_88", "logos-package": "logos-package_9", "nix-bundle-appimage": "nix-bundle-appimage_4", "nix-bundle-dir": "nix-bundle-dir_13", @@ -3631,7 +3734,7 @@ }, "logos-package-manager_5": { "inputs": { - "logos-nix": "logos-nix_97", + "logos-nix": "logos-nix_99", "logos-package": "logos-package_11", "nix-bundle-appimage": "nix-bundle-appimage_5", "nix-bundle-dir": "nix-bundle-dir_16", @@ -3660,7 +3763,7 @@ }, "logos-package-manager_6": { "inputs": { - "logos-nix": "logos-nix_114", + "logos-nix": "logos-nix_116", "logos-package": "logos-package_14", "nix-bundle-appimage": "nix-bundle-appimage_6", "nix-bundle-dir": "nix-bundle-dir_20", @@ -3688,7 +3791,7 @@ }, "logos-package_10": { "inputs": { - "logos-nix": "logos-nix_92", + "logos-nix": "logos-nix_94", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3718,7 +3821,7 @@ }, "logos-package_11": { "inputs": { - "logos-nix": "logos-nix_98", + "logos-nix": "logos-nix_100", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3745,7 +3848,7 @@ }, "logos-package_12": { "inputs": { - "logos-nix": "logos-nix_107", + "logos-nix": "logos-nix_109", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3771,7 +3874,7 @@ }, "logos-package_13": { "inputs": { - "logos-nix": "logos-nix_111", + "logos-nix": "logos-nix_113", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -3796,7 +3899,7 @@ }, "logos-package_14": { "inputs": { - "logos-nix": "logos-nix_115", + "logos-nix": "logos-nix_117", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3822,7 +3925,7 @@ }, "logos-package_15": { "inputs": { - "logos-nix": "logos-nix_120", + "logos-nix": "logos-nix_122", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -3848,7 +3951,7 @@ }, "logos-package_2": { "inputs": { - "logos-nix": "logos-nix_35", + "logos-nix": "logos-nix_37", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3877,7 +3980,7 @@ }, "logos-package_3": { "inputs": { - "logos-nix": "logos-nix_39", + "logos-nix": "logos-nix_41", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3905,7 +4008,7 @@ }, "logos-package_4": { "inputs": { - "logos-nix": "logos-nix_43", + "logos-nix": "logos-nix_45", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3934,7 +4037,7 @@ }, "logos-package_5": { "inputs": { - "logos-nix": "logos-nix_48", + "logos-nix": "logos-nix_50", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3963,7 +4066,7 @@ }, "logos-package_6": { "inputs": { - "logos-nix": "logos-nix_70", + "logos-nix": "logos-nix_72", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -3994,7 +4097,7 @@ }, "logos-package_7": { "inputs": { - "logos-nix": "logos-nix_79", + "logos-nix": "logos-nix_81", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4024,7 +4127,7 @@ }, "logos-package_8": { "inputs": { - "logos-nix": "logos-nix_83", + "logos-nix": "logos-nix_85", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4053,7 +4156,7 @@ }, "logos-package_9": { "inputs": { - "logos-nix": "logos-nix_87", + "logos-nix": "logos-nix_89", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4093,11 +4196,11 @@ ] }, "locked": { - "lastModified": 1780929868, - "narHash": "sha256-yDxv9Cv5VEJDVqHz9qYCU3UXv+kCIjRoD90A7uGYuGU=", + "lastModified": 1781532038, + "narHash": "sha256-C6SXkO2efD7rNK5iIbxqLZKtOOsUVSNxw2m3DVEhijE=", "owner": "logos-co", "repo": "logos-plugin-qt", - "rev": "68090d0a976224ca1c3c606c486a9ac3dd7a4559", + "rev": "f33f264abb6d628cc78cf926f9f33c7cc8252151", "type": "github" }, "original": { @@ -4109,7 +4212,7 @@ "logos-plugin-core_2": { "inputs": { "logos-module": "logos-module_5", - "logos-nix": "logos-nix_12", + "logos-nix": "logos-nix_14", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4137,7 +4240,7 @@ "logos-plugin-core_3": { "inputs": { "logos-module": "logos-module_11", - "logos-nix": "logos-nix_56", + "logos-nix": "logos-nix_58", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4175,11 +4278,11 @@ ] }, "locked": { - "lastModified": 1780929868, - "narHash": "sha256-yDxv9Cv5VEJDVqHz9qYCU3UXv+kCIjRoD90A7uGYuGU=", + "lastModified": 1781532038, + "narHash": "sha256-C6SXkO2efD7rNK5iIbxqLZKtOOsUVSNxw2m3DVEhijE=", "owner": "logos-co", "repo": "logos-plugin-qt", - "rev": "68090d0a976224ca1c3c606c486a9ac3dd7a4559", + "rev": "f33f264abb6d628cc78cf926f9f33c7cc8252151", "type": "github" }, "original": { @@ -4191,7 +4294,7 @@ "logos-plugin-qt_2": { "inputs": { "logos-module": "logos-module_6", - "logos-nix": "logos-nix_14", + "logos-nix": "logos-nix_16", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4219,7 +4322,7 @@ "logos-plugin-qt_3": { "inputs": { "logos-module": "logos-module_12", - "logos-nix": "logos-nix_58", + "logos-nix": "logos-nix_60", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4245,9 +4348,60 @@ "type": "github" } }, + "logos-protocol": { + "inputs": { + "logos-nix": "logos-nix_8", + "nixpkgs": [ + "logos-module-builder", + "logos-protocol", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781303997, + "narHash": "sha256-j9U4wPlHdN5oA+65h1SAo/s2YUHvNYKxij4/pCqEtAs=", + "owner": "logos-co", + "repo": "logos-protocol", + "rev": "9de4165ab68ece4071647026cb2596bed8a8d7e2", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-protocol", + "type": "github" + } + }, + "logos-protocol_2": { + "inputs": { + "logos-nix": [ + "logos-module-builder", + "logos-test-framework", + "logos-nix" + ], + "nixpkgs": [ + "logos-module-builder", + "logos-test-framework", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781065710, + "narHash": "sha256-QmNQ7LdrfzyvsZGISGKJKbHqB03F6JExgGF2K1f2WcE=", + "owner": "logos-co", + "repo": "logos-protocol", + "rev": "ca28190272eef2772edf9b3e1df47e121f02a726", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-protocol", + "type": "github" + } + }, "logos-qt-mcp": { "inputs": { - "logos-nix": "logos-nix_32", + "logos-nix": "logos-nix_34", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4274,7 +4428,7 @@ }, "logos-qt-mcp_2": { "inputs": { - "logos-nix": "logos-nix_76", + "logos-nix": "logos-nix_78", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4302,7 +4456,7 @@ }, "logos-qt-mcp_3": { "inputs": { - "logos-nix": "logos-nix_104", + "logos-nix": "logos-nix_106", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4325,13 +4479,123 @@ "type": "github" } }, + "logos-qt-sdk": { + "inputs": { + "logos-cpp-sdk": [ + "logos-module-builder", + "logos-cpp-sdk" + ], + "logos-lidl": "logos-lidl_2", + "logos-nix": "logos-nix_9", + "logos-protocol": [ + "logos-module-builder", + "logos-protocol" + ], + "nixpkgs": [ + "logos-module-builder", + "logos-qt-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781655169, + "narHash": "sha256-wjbHmczSG8VUMlRkIp3pviVTLPTzReDbIRfBpqnlQr4=", + "owner": "logos-co", + "repo": "logos-qt-sdk", + "rev": "812369213719773f6486755a30c476a699469b37", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-qt-sdk", + "type": "github" + } + }, + "logos-qt-sdk_2": { + "inputs": { + "logos-cpp-sdk": [ + "logos-module-builder", + "logos-test-framework", + "logos-cpp-sdk" + ], + "logos-nix": [ + "logos-module-builder", + "logos-test-framework", + "logos-nix" + ], + "logos-protocol": [ + "logos-module-builder", + "logos-test-framework", + "logos-protocol" + ], + "nixpkgs": [ + "logos-module-builder", + "logos-test-framework", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781066423, + "narHash": "sha256-3pVeJ/cK2z4OEi5iLORjoC7YpdrRrHmigl9SyvEapI8=", + "owner": "logos-co", + "repo": "logos-qt-sdk", + "rev": "355774603877637b486ea0aeefbf7828ae321868", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-qt-sdk", + "type": "github" + } + }, + "logos-rust-sdk": { + "inputs": { + "logos-logoscore-cli": [ + "logos-module-builder", + "logos-cpp-sdk" + ], + "logos-module-builder": [ + "logos-module-builder", + "logos-cpp-sdk" + ], + "logos-module-client": [ + "logos-module-builder", + "logos-cpp-sdk" + ], + "logos-nix": [ + "logos-module-builder", + "logos-nix" + ], + "nixpkgs": [ + "logos-module-builder", + "logos-rust-sdk", + "logos-nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1781550278, + "narHash": "sha256-j3CZSeGvvw+X5qRLlaHh1UfUNFc2hNs756hSN04J/XQ=", + "owner": "logos-co", + "repo": "logos-rust-sdk", + "rev": "340f42d41008488d912257e7836789795adbaeb7", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-rust-sdk", + "rev": "340f42d41008488d912257e7836789795adbaeb7", + "type": "github" + } + }, "logos-standalone-app": { "inputs": { "logos-capability-module": "logos-capability-module", "logos-cpp-sdk": "logos-cpp-sdk_6", "logos-design-system": "logos-design-system_2", "logos-liblogos": "logos-liblogos_2", - "logos-nix": "logos-nix_103", + "logos-nix": "logos-nix_105", "logos-qt-mcp": "logos-qt-mcp_3", "logos-view-module-runtime": "logos-view-module-runtime_3", "nix-bundle-lgx": "nix-bundle-lgx_7", @@ -4362,7 +4626,7 @@ "logos-cpp-sdk": "logos-cpp-sdk_3", "logos-design-system": "logos-design-system", "logos-liblogos": "logos-liblogos", - "logos-nix": "logos-nix_31", + "logos-nix": "logos-nix_33", "logos-qt-mcp": "logos-qt-mcp", "logos-view-module-runtime": "logos-view-module-runtime", "nix-bundle-lgx": "nix-bundle-lgx", @@ -4396,7 +4660,7 @@ "logos-cpp-sdk": "logos-cpp-sdk_8", "logos-design-system": "logos-design-system_3", "logos-liblogos": "logos-liblogos_3", - "logos-nix": "logos-nix_75", + "logos-nix": "logos-nix_77", "logos-qt-mcp": "logos-qt-mcp_2", "logos-view-module-runtime": "logos-view-module-runtime_2", "nix-bundle-lgx": "nix-bundle-lgx_4", @@ -4434,7 +4698,7 @@ "logos-module-builder", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_37", + "logos-nix": "logos-nix_39", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4469,7 +4733,7 @@ "logos-module-builder", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_81", + "logos-nix": "logos-nix_83", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4501,7 +4765,9 @@ "logos-module-builder", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_109", + "logos-nix": "logos-nix_111", + "logos-protocol": "logos-protocol_2", + "logos-qt-sdk": "logos-qt-sdk_2", "nixpkgs": [ "logos-module-builder", "logos-test-framework", @@ -4510,11 +4776,11 @@ ] }, "locked": { - "lastModified": 1780432542, - "narHash": "sha256-LcZnXuNTCyFQS7rhOHF3sy+oF6PNq/H1MLPHch08XrU=", + "lastModified": 1781118884, + "narHash": "sha256-bM8Deqf6soZeUqWy3RdyY0APRKLWmjD/78g1fbEObaY=", "owner": "logos-co", "repo": "logos-test-framework", - "rev": "ee081954096f602b47308c6dc7d00fb71d5dcdc7", + "rev": "5b8fcc9ffdc5c66511a95a6bf6b41dd74fbbacc9", "type": "github" }, "original": { @@ -4533,7 +4799,7 @@ "logos-standalone-app", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_33", + "logos-nix": "logos-nix_35", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4569,7 +4835,7 @@ "logos-standalone-app", "logos-cpp-sdk" ], - "logos-nix": "logos-nix_77", + "logos-nix": "logos-nix_79", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4598,7 +4864,7 @@ "logos-view-module-runtime_3": { "inputs": { "logos-cpp-sdk": "logos-cpp-sdk_12", - "logos-nix": "logos-nix_105", + "logos-nix": "logos-nix_107", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4623,7 +4889,7 @@ }, "nix-bundle-appimage": { "inputs": { - "logos-nix": "logos-nix_27", + "logos-nix": "logos-nix_29", "nix-bundle-dir": "nix-bundle-dir", "nixpkgs": [ "logos-module-builder", @@ -4654,7 +4920,7 @@ }, "nix-bundle-appimage_2": { "inputs": { - "logos-nix": "logos-nix_44", + "logos-nix": "logos-nix_46", "nix-bundle-dir": "nix-bundle-dir_5", "nixpkgs": [ "logos-module-builder", @@ -4684,7 +4950,7 @@ }, "nix-bundle-appimage_3": { "inputs": { - "logos-nix": "logos-nix_71", + "logos-nix": "logos-nix_73", "nix-bundle-dir": "nix-bundle-dir_8", "nixpkgs": [ "logos-module-builder", @@ -4716,7 +4982,7 @@ }, "nix-bundle-appimage_4": { "inputs": { - "logos-nix": "logos-nix_88", + "logos-nix": "logos-nix_90", "nix-bundle-dir": "nix-bundle-dir_12", "nixpkgs": [ "logos-module-builder", @@ -4747,7 +5013,7 @@ }, "nix-bundle-appimage_5": { "inputs": { - "logos-nix": "logos-nix_99", + "logos-nix": "logos-nix_101", "nix-bundle-dir": "nix-bundle-dir_15", "nixpkgs": [ "logos-module-builder", @@ -4775,7 +5041,7 @@ }, "nix-bundle-appimage_6": { "inputs": { - "logos-nix": "logos-nix_116", + "logos-nix": "logos-nix_118", "nix-bundle-dir": "nix-bundle-dir_19", "nixpkgs": [ "logos-module-builder", @@ -4802,7 +5068,7 @@ }, "nix-bundle-dir": { "inputs": { - "logos-nix": "logos-nix_28", + "logos-nix": "logos-nix_30", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4831,7 +5097,7 @@ }, "nix-bundle-dir_10": { "inputs": { - "logos-nix": "logos-nix_80", + "logos-nix": "logos-nix_82", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4861,7 +5127,7 @@ }, "nix-bundle-dir_11": { "inputs": { - "logos-nix": "logos-nix_84", + "logos-nix": "logos-nix_86", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4890,7 +5156,7 @@ }, "nix-bundle-dir_12": { "inputs": { - "logos-nix": "logos-nix_89", + "logos-nix": "logos-nix_91", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4919,7 +5185,7 @@ }, "nix-bundle-dir_13": { "inputs": { - "logos-nix": "logos-nix_90", + "logos-nix": "logos-nix_92", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4949,7 +5215,7 @@ }, "nix-bundle-dir_14": { "inputs": { - "logos-nix": "logos-nix_93", + "logos-nix": "logos-nix_95", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -4979,7 +5245,7 @@ }, "nix-bundle-dir_15": { "inputs": { - "logos-nix": "logos-nix_100", + "logos-nix": "logos-nix_102", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5005,7 +5271,7 @@ }, "nix-bundle-dir_16": { "inputs": { - "logos-nix": "logos-nix_101", + "logos-nix": "logos-nix_103", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5032,7 +5298,7 @@ }, "nix-bundle-dir_17": { "inputs": { - "logos-nix": "logos-nix_108", + "logos-nix": "logos-nix_110", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5058,7 +5324,7 @@ }, "nix-bundle-dir_18": { "inputs": { - "logos-nix": "logos-nix_112", + "logos-nix": "logos-nix_114", "nixpkgs": [ "logos-module-builder", "nix-bundle-lgx", @@ -5083,7 +5349,7 @@ }, "nix-bundle-dir_19": { "inputs": { - "logos-nix": "logos-nix_117", + "logos-nix": "logos-nix_119", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -5108,7 +5374,7 @@ }, "nix-bundle-dir_2": { "inputs": { - "logos-nix": "logos-nix_29", + "logos-nix": "logos-nix_31", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5138,7 +5404,7 @@ }, "nix-bundle-dir_20": { "inputs": { - "logos-nix": "logos-nix_118", + "logos-nix": "logos-nix_120", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -5164,7 +5430,7 @@ }, "nix-bundle-dir_21": { "inputs": { - "logos-nix": "logos-nix_121", + "logos-nix": "logos-nix_123", "nixpkgs": [ "logos-module-builder", "nix-bundle-logos-module-install", @@ -5190,7 +5456,7 @@ }, "nix-bundle-dir_3": { "inputs": { - "logos-nix": "logos-nix_36", + "logos-nix": "logos-nix_38", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5219,7 +5485,7 @@ }, "nix-bundle-dir_4": { "inputs": { - "logos-nix": "logos-nix_40", + "logos-nix": "logos-nix_42", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5247,7 +5513,7 @@ }, "nix-bundle-dir_5": { "inputs": { - "logos-nix": "logos-nix_45", + "logos-nix": "logos-nix_47", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5275,7 +5541,7 @@ }, "nix-bundle-dir_6": { "inputs": { - "logos-nix": "logos-nix_46", + "logos-nix": "logos-nix_48", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5304,7 +5570,7 @@ }, "nix-bundle-dir_7": { "inputs": { - "logos-nix": "logos-nix_49", + "logos-nix": "logos-nix_51", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5333,7 +5599,7 @@ }, "nix-bundle-dir_8": { "inputs": { - "logos-nix": "logos-nix_72", + "logos-nix": "logos-nix_74", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5363,7 +5629,7 @@ }, "nix-bundle-dir_9": { "inputs": { - "logos-nix": "logos-nix_73", + "logos-nix": "logos-nix_75", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -5394,7 +5660,7 @@ }, "nix-bundle-lgx": { "inputs": { - "logos-nix": "logos-nix_34", + "logos-nix": "logos-nix_36", "logos-package": "logos-package_2", "nix-bundle-dir": "nix-bundle-dir_3", "nixpkgs": [ @@ -5423,7 +5689,7 @@ }, "nix-bundle-lgx_2": { "inputs": { - "logos-nix": "logos-nix_38", + "logos-nix": "logos-nix_40", "logos-package": "logos-package_3", "nix-bundle-dir": "nix-bundle-dir_4", "nixpkgs": [ @@ -5452,7 +5718,7 @@ }, "nix-bundle-lgx_3": { "inputs": { - "logos-nix": "logos-nix_47", + "logos-nix": "logos-nix_49", "logos-package": "logos-package_5", "nix-bundle-dir": "nix-bundle-dir_7", "nixpkgs": [ @@ -5482,7 +5748,7 @@ }, "nix-bundle-lgx_4": { "inputs": { - "logos-nix": "logos-nix_78", + "logos-nix": "logos-nix_80", "logos-package": "logos-package_7", "nix-bundle-dir": "nix-bundle-dir_10", "nixpkgs": [ @@ -5512,7 +5778,7 @@ }, "nix-bundle-lgx_5": { "inputs": { - "logos-nix": "logos-nix_82", + "logos-nix": "logos-nix_84", "logos-package": "logos-package_8", "nix-bundle-dir": "nix-bundle-dir_11", "nixpkgs": [ @@ -5542,7 +5808,7 @@ }, "nix-bundle-lgx_6": { "inputs": { - "logos-nix": "logos-nix_91", + "logos-nix": "logos-nix_93", "logos-package": "logos-package_10", "nix-bundle-dir": "nix-bundle-dir_14", "nixpkgs": [ @@ -5573,7 +5839,7 @@ }, "nix-bundle-lgx_7": { "inputs": { - "logos-nix": "logos-nix_106", + "logos-nix": "logos-nix_108", "logos-package": "logos-package_12", "nix-bundle-dir": "nix-bundle-dir_17", "nixpkgs": [ @@ -5600,7 +5866,7 @@ }, "nix-bundle-lgx_8": { "inputs": { - "logos-nix": "logos-nix_110", + "logos-nix": "logos-nix_112", "logos-package": "logos-package_13", "nix-bundle-dir": "nix-bundle-dir_18", "nixpkgs": [ @@ -5626,7 +5892,7 @@ }, "nix-bundle-lgx_9": { "inputs": { - "logos-nix": "logos-nix_119", + "logos-nix": "logos-nix_121", "logos-package": "logos-package_15", "nix-bundle-dir": "nix-bundle-dir_21", "nixpkgs": [ @@ -5653,7 +5919,7 @@ }, "nix-bundle-logos-module-install": { "inputs": { - "logos-nix": "logos-nix_41", + "logos-nix": "logos-nix_43", "logos-package-manager": "logos-package-manager_2", "nix-bundle-lgx": "nix-bundle-lgx_3", "nixpkgs": [ @@ -5682,7 +5948,7 @@ }, "nix-bundle-logos-module-install_2": { "inputs": { - "logos-nix": "logos-nix_85", + "logos-nix": "logos-nix_87", "logos-package-manager": "logos-package-manager_4", "nix-bundle-lgx": "nix-bundle-lgx_6", "nixpkgs": [ @@ -5712,7 +5978,7 @@ }, "nix-bundle-logos-module-install_3": { "inputs": { - "logos-nix": "logos-nix_113", + "logos-nix": "logos-nix_115", "logos-package-manager": "logos-package-manager_6", "nix-bundle-lgx": "nix-bundle-lgx_9", "nixpkgs": [ @@ -6200,6 +6466,38 @@ "type": "github" } }, + "nixpkgs_125": { + "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_126": { + "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_13": { "locked": { "lastModified": 1759036355, @@ -7722,7 +8020,7 @@ }, "process-stats": { "inputs": { - "logos-nix": "logos-nix_30", + "logos-nix": "logos-nix_32", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -7751,7 +8049,7 @@ }, "process-stats_2": { "inputs": { - "logos-nix": "logos-nix_74", + "logos-nix": "logos-nix_76", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", @@ -7781,7 +8079,7 @@ }, "process-stats_3": { "inputs": { - "logos-nix": "logos-nix_102", + "logos-nix": "logos-nix_104", "nixpkgs": [ "logos-module-builder", "logos-standalone-app", diff --git a/flake.nix b/flake.nix index 7fc49a3..1048e9d 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Logos Blockchain Module - Qt6 Plugin"; inputs = { - logos-module-builder.url = "github:logos-co/logos-module-builder"; + logos-module-builder.url = "github:logos-co/logos-module-builder?ref=bc868bf47f9d797637ac78af814b0db718dde4b8"; # v0.1.3-rc.10-compatible + rust-rapidsnark nix fixes + cli commands + leader_claim C binding + config generation fixes logos-blockchain.url = "github:logos-blockchain/logos-blockchain?ref=3dc81b4ec49ba977220f3ff432885258265aa986"; }; From 3ad929ee4e36e494751e56233fbfbec343033151 Mon Sep 17 00:00:00 2001 From: Daniel Sanchez Date: Thu, 18 Jun 2026 15:43:54 +0200 Subject: [PATCH 3/3] feat(wallet): Add channel deposit calls and notes retrieval (#38) * Add channel deposit calls and notes retrieval * Use TX_HASH_BYTES --- flake.lock | 8 +- flake.nix | 4 +- src/logos_blockchain_module.cpp | 229 +++++++++++++++++++++ src/logos_blockchain_module.h | 36 ++++ tests/mocks/mock_logos_blockchain.cpp | 52 +++++ tests/stubs/logos_blockchain.h | 51 +++++ tests/test_blockchain.cpp | 286 ++++++++++++++++++++++++++ 7 files changed, 660 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index c15be9e..f40e959 100644 --- a/flake.lock +++ b/flake.lock @@ -24,16 +24,16 @@ "rust-rapidsnark": "rust-rapidsnark" }, "locked": { - "lastModified": 1781613030, - "narHash": "sha256-kJZ8N/FeJBZRyRtP5JlXVf9zczOPrsBJW17mAsJdKeo=", + "lastModified": 1781698521, + "narHash": "sha256-cnk7CmRskPL5CjH3Q0vZEoLbYVkwUaQrq86xdJiLje8=", "owner": "logos-blockchain", "repo": "logos-blockchain", - "rev": "3dc81b4ec49ba977220f3ff432885258265aa986", + "rev": "0222706b14010fbdfbe9a94d3617ebf46a77fdd1", "type": "github" }, "original": { "owner": "logos-blockchain", - "ref": "3dc81b4ec49ba977220f3ff432885258265aa986", + "ref": "0222706b14010fbdfbe9a94d3617ebf46a77fdd1", "repo": "logos-blockchain", "type": "github" } diff --git a/flake.nix b/flake.nix index 1048e9d..debd81f 100644 --- a/flake.nix +++ b/flake.nix @@ -3,8 +3,8 @@ inputs = { logos-module-builder.url = "github:logos-co/logos-module-builder?ref=bc868bf47f9d797637ac78af814b0db718dde4b8"; - # v0.1.3-rc.10-compatible + rust-rapidsnark nix fixes + cli commands + leader_claim C binding + config generation fixes - logos-blockchain.url = "github:logos-blockchain/logos-blockchain?ref=3dc81b4ec49ba977220f3ff432885258265aa986"; + # v0.1.3-rc.10-compatible + rust-rapidsnark nix fixes + cli commands + leader_claim + channel deposit / wallet notes C bindings + logos-blockchain.url = "github:logos-blockchain/logos-blockchain?ref=0222706b14010fbdfbe9a94d3617ebf46a77fdd1"; }; outputs = inputs@{ logos-module-builder, ... }: diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index bfbe09c..07b0ca7 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -48,6 +48,27 @@ namespace { } } + // Parse arbitrary-length hex (optional 0x prefix) into bytes. Unlike + // parse_address_hex this does not enforce a fixed length; used for the + // variable-length channel deposit metadata. Returns false on odd length or + // non-hex input. + bool parse_hex_bytes(const std::string& hex_in, std::vector& out) { + std::string hex = hex_in; + boost::algorithm::trim(hex); + if (hex.size() >= 2 && hex[0] == '0' && (hex[1] == 'x' || hex[1] == 'X')) + hex = hex.substr(2); + if (hex.size() % 2 != 0) + return false; + try { + std::string decoded; + boost::algorithm::unhex(hex.begin(), hex.end(), std::back_inserter(decoded)); + out.assign(decoded.begin(), decoded.end()); + return true; + } catch (const boost::algorithm::non_hex_input&) { + return false; + } + } + std::string bytes_to_hex(const uint8_t* data, size_t len) { std::string out; out.reserve(len * 2); @@ -604,6 +625,54 @@ std::vector LogosBlockchainModule::wallet_get_known_addresses() { return out; } +std::string LogosBlockchainModule::wallet_get_notes( + const std::string& wallet_address_hex, + const std::string& optional_tip_hex +) { + if (!node) { + return "Error: The node is not running."; + } + + const std::vector address_bytes = parse_address_hex(wallet_address_hex); + if (address_bytes.empty() || static_cast(address_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid wallet address (64 hex characters required)."; + } + + std::vector tip_bytes; + const HeaderId* optional_tip = nullptr; + if (!optional_tip_hex.empty()) { + tip_bytes = parse_address_hex(optional_tip_hex); + if (tip_bytes.empty() || static_cast(tip_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid optional tip (64 hex characters or empty)."; + } + optional_tip = reinterpret_cast(tip_bytes.data()); + } + + auto [value, error] = get_wallet_notes(node, address_bytes.data(), optional_tip); + if (!is_ok(&error)) { + return "Error: Failed to get wallet notes: " + std::to_string(error); + } + + json obj; + obj["tip"] = bytes_to_hex(reinterpret_cast(value.tip), TX_HASH_BYTES); + json notes = json::array(); + for (size_t i = 0; i < value.len; ++i) { + const WalletNote& note = value.notes[i]; + json n; + n["id"] = bytes_to_hex(reinterpret_cast(note.id), TX_HASH_BYTES); + // Value is u64; serialized as a string to avoid JSON number precision loss. + n["value"] = std::to_string(note.value); + notes.push_back(std::move(n)); + } + obj["notes"] = std::move(notes); + + const OperationStatus free_status = free_wallet_notes(value); + if (!is_ok(&free_status)) { + fprintf(stderr, "Failed to free wallet notes. Error: %d\n", free_status); + } + return obj.dump(); +} + std::string LogosBlockchainModule::leader_claim() { if (!node) { return "Error: The node is not running."; @@ -617,6 +686,166 @@ std::string LogosBlockchainModule::leader_claim() { return bytes_to_hex(reinterpret_cast(&value), TX_HASH_BYTES); } +// Channel + +std::string LogosBlockchainModule::channel_deposit( + const std::string& channel_id_hex, + const std::string& funding_public_key_hex, + const std::string& amount, + const std::string& metadata_hex, + const std::string& optional_tip_hex +) { + if (!node) { + return "Error: The node is not running."; + } + + std::string amount_trimmed = amount; + boost::algorithm::trim(amount_trimmed); + uint64_t amount_val = 0; + auto [ptr, ec] = std::from_chars(amount_trimmed.data(), amount_trimmed.data() + amount_trimmed.size(), amount_val); + if (ec != std::errc{} || ptr != amount_trimmed.data() + amount_trimmed.size() || amount_trimmed.empty()) { + return "Error: Invalid amount (positive integer required)."; + } + if (amount_val == 0) { + return "Error: Invalid amount (must be greater than zero)."; + } + + const std::vector channel_bytes = parse_address_hex(channel_id_hex); + if (channel_bytes.empty() || static_cast(channel_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid channel_id (64 hex characters required)."; + } + + const std::vector funding_bytes = parse_address_hex(funding_public_key_hex); + if (funding_bytes.empty() || static_cast(funding_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid funding_public_key (64 hex characters required)."; + } + + std::vector metadata_bytes; + if (!metadata_hex.empty() && !parse_hex_bytes(metadata_hex, metadata_bytes)) { + return "Error: Invalid metadata (even-length hex string required)."; + } + + std::vector tip_bytes; + const HeaderId* optional_tip = nullptr; + if (!optional_tip_hex.empty()) { + tip_bytes = parse_address_hex(optional_tip_hex); + if (tip_bytes.empty() || static_cast(tip_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid optional tip (64 hex characters or empty)."; + } + optional_tip = reinterpret_cast(tip_bytes.data()); + } + + ChannelDepositArguments args{}; + args.optional_tip = optional_tip; + args.channel_id = channel_bytes.data(); + args.funding_public_key = funding_bytes.data(); + args.amount = amount_val; + args.metadata = metadata_bytes.empty() ? nullptr : metadata_bytes.data(); + args.metadata_len = metadata_bytes.size(); + + auto [value, error] = ::channel_deposit(node, &args); + if (!is_ok(&error)) { + return "Error: Failed to deposit into channel: " + std::to_string(error); + } + return bytes_to_hex(reinterpret_cast(&value), ADDRESS_BYTES); +} + +std::string LogosBlockchainModule::channel_deposit_with_notes( + const std::string& channel_id_hex, + const std::vector& input_note_id_hexes, + const std::string& metadata_hex, + const std::string& change_public_key_hex, + const std::vector& funding_public_key_hexes, + const std::string& max_tx_fee, + const std::string& optional_tip_hex +) { + if (!node) { + return "Error: The node is not running."; + } + + const std::vector channel_bytes = parse_address_hex(channel_id_hex); + if (channel_bytes.empty() || static_cast(channel_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid channel_id (64 hex characters required)."; + } + + if (input_note_id_hexes.empty()) { + return "Error: At least one input note required."; + } + // Note IDs are 32-byte values stored contiguously so the buffer can be passed + // as a `NoteId` (uint8_t[32]) array. + std::vector note_ids_flat; + note_ids_flat.reserve(input_note_id_hexes.size() * ADDRESS_BYTES); + for (const std::string& hex : input_note_id_hexes) { + const std::vector b = parse_address_hex(hex); + if (b.empty() || static_cast(b.size()) != ADDRESS_BYTES) { + return "Error: Invalid input note id (64 hex characters required)."; + } + note_ids_flat.insert(note_ids_flat.end(), b.begin(), b.end()); + } + + const std::vector change_bytes = parse_address_hex(change_public_key_hex); + if (change_bytes.empty() || static_cast(change_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid change_public_key (64 hex characters required)."; + } + + if (funding_public_key_hexes.empty()) { + return "Error: At least one funding public key required."; + } + std::vector> funding_bytes; + for (const std::string& hex : funding_public_key_hexes) { + std::vector b = parse_address_hex(hex); + if (b.empty() || static_cast(b.size()) != ADDRESS_BYTES) { + return "Error: Invalid funding public key (64 hex characters required)."; + } + funding_bytes.push_back(std::move(b)); + } + std::vector funding_ptrs; + funding_ptrs.reserve(funding_bytes.size()); + for (const auto& b : funding_bytes) + funding_ptrs.push_back(b.data()); + + std::string fee_trimmed = max_tx_fee; + boost::algorithm::trim(fee_trimmed); + uint64_t max_tx_fee_val = 0; + auto [ptr, ec] = std::from_chars(fee_trimmed.data(), fee_trimmed.data() + fee_trimmed.size(), max_tx_fee_val); + if (ec != std::errc{} || ptr != fee_trimmed.data() + fee_trimmed.size() || fee_trimmed.empty()) { + return "Error: Invalid max_tx_fee (non-negative integer required)."; + } + + std::vector metadata_bytes; + if (!metadata_hex.empty() && !parse_hex_bytes(metadata_hex, metadata_bytes)) { + return "Error: Invalid metadata (even-length hex string required)."; + } + + std::vector tip_bytes; + const HeaderId* optional_tip = nullptr; + if (!optional_tip_hex.empty()) { + tip_bytes = parse_address_hex(optional_tip_hex); + if (tip_bytes.empty() || static_cast(tip_bytes.size()) != ADDRESS_BYTES) { + return "Error: Invalid optional tip (64 hex characters or empty)."; + } + optional_tip = reinterpret_cast(tip_bytes.data()); + } + + ChannelDepositWithNotesArguments args{}; + args.optional_tip = optional_tip; + args.channel_id = channel_bytes.data(); + args.input_note_ids = reinterpret_cast(note_ids_flat.data()); + args.input_note_ids_len = input_note_id_hexes.size(); + args.metadata = metadata_bytes.empty() ? nullptr : metadata_bytes.data(); + args.metadata_len = metadata_bytes.size(); + args.change_public_key = change_bytes.data(); + args.funding_public_keys = funding_ptrs.data(); + args.funding_public_keys_len = funding_ptrs.size(); + args.max_tx_fee = max_tx_fee_val; + + auto [value, error] = ::channel_deposit_with_notes(node, &args); + if (!is_ok(&error)) { + return "Error: Failed to deposit into channel: " + std::to_string(error); + } + return bytes_to_hex(reinterpret_cast(&value), ADDRESS_BYTES); +} + // Blend std::string LogosBlockchainModule::blend_join_as_core_node( diff --git a/src/logos_blockchain_module.h b/src/logos_blockchain_module.h index cb4ba91..fafee67 100644 --- a/src/logos_blockchain_module.h +++ b/src/logos_blockchain_module.h @@ -75,8 +75,44 @@ public: const std::string& optional_tip_hex ); std::vector wallet_get_known_addresses(); + // Spendable notes (UTXOs) of a wallet address, as a JSON string: + // { "tip": "", "notes": [ { "id": "", "value": "" }, ... ] } + // optional_tip_hex may be empty to query at the current tip. Note IDs round-trip + // into channel_deposit_with_notes. + std::string wallet_get_notes( + const std::string& wallet_address_hex, + const std::string& optional_tip_hex + ); std::string leader_claim(); + // Channel + // Amount-based deposit: the binding selects funding notes itself (splitting a + // note via a transfer when no exact-value note exists) so the channel receives + // exactly `amount`. funding_public_key owns the funding notes, the deposit note + // and any change. metadata_hex may be empty; optional_tip_hex may be empty to + // build against the current tip. Returns the transaction hash hex on success. + std::string channel_deposit( + const std::string& channel_id_hex, + const std::string& funding_public_key_hex, + const std::string& amount, + const std::string& metadata_hex, + const std::string& optional_tip_hex + ); + // Note-based deposit: the caller supplies the exact notes to consume (their + // whole value enters the channel), so amount = sum of the notes' values. Use + // wallet_get_notes to obtain note IDs. The gas fee is funded from + // funding_public_keys (change to change_public_key), capped at max_tx_fee. + // metadata_hex / optional_tip_hex may be empty. Returns the tx hash hex. + std::string channel_deposit_with_notes( + const std::string& channel_id_hex, + const std::vector& input_note_id_hexes, + const std::string& metadata_hex, + const std::string& change_public_key_hex, + const std::vector& funding_public_key_hexes, + const std::string& max_tx_fee, + const std::string& optional_tip_hex + ); + // Blend std::string blend_join_as_core_node( const std::string& provider_id_hex, diff --git a/tests/mocks/mock_logos_blockchain.cpp b/tests/mocks/mock_logos_blockchain.cpp index 19e13f5..86afcad 100644 --- a/tests/mocks/mock_logos_blockchain.cpp +++ b/tests/mocks/mock_logos_blockchain.cpp @@ -169,6 +169,58 @@ OperationStatus free_known_addresses(KnownAddresses addrs) { return 0; } +// Wallet-notes mock storage (up to 4 notes) +static WalletNote s_mockNotes[4]; + +FfiWalletNotesResult get_wallet_notes( + LogosBlockchainNode* node, + const uint8_t* wallet_address, + const HeaderId* optional_tip) +{ + LOGOS_CMOCK_RECORD("get_wallet_notes"); + FfiWalletNotesResult result; + memset(&result.value, 0, sizeof(WalletNotes)); + int err = LOGOS_CMOCK_RETURN(int, "get_wallet_notes_error"); + result.error = err; + if (err == 0) { + int count = LOGOS_CMOCK_RETURN(int, "get_wallet_notes_count"); + if (count > 4) count = 4; + if (count < 0) count = 0; + for (int i = 0; i < count; ++i) { + memset(s_mockNotes[i].id, 0x10 + i, sizeof(NoteId)); + s_mockNotes[i].value = static_cast(100 * (i + 1)); + } + memset(result.value.tip, 0xFF, sizeof(HeaderId)); + result.value.notes = count > 0 ? s_mockNotes : nullptr; + result.value.len = static_cast(count); + } + return result; +} + +OperationStatus free_wallet_notes(WalletNotes notes) { + LOGOS_CMOCK_RECORD("free_wallet_notes"); + return 0; +} + +FfiChannelDepositResult channel_deposit(LogosBlockchainNode* node, const ChannelDepositArguments* arguments) { + LOGOS_CMOCK_RECORD("channel_deposit"); + FfiChannelDepositResult result; + memset(result.value, 0xBC, sizeof(Hash)); + result.error = LOGOS_CMOCK_RETURN(int, "channel_deposit_error"); + return result; +} + +FfiChannelDepositResult channel_deposit_with_notes( + LogosBlockchainNode* node, + const ChannelDepositWithNotesArguments* arguments) +{ + LOGOS_CMOCK_RECORD("channel_deposit_with_notes"); + FfiChannelDepositResult result; + memset(result.value, 0xDE, sizeof(Hash)); + result.error = LOGOS_CMOCK_RETURN(int, "channel_deposit_with_notes_error"); + return result; +} + BlendHashResult blend_join_as_core_node( LogosBlockchainNode* node, const uint8_t* provider_id, diff --git a/tests/stubs/logos_blockchain.h b/tests/stubs/logos_blockchain.h index 10f2889..3b0ff5c 100644 --- a/tests/stubs/logos_blockchain.h +++ b/tests/stubs/logos_blockchain.h @@ -16,6 +16,7 @@ extern "C" { typedef uint8_t Hash[32]; typedef uint8_t HeaderId[32]; typedef uint8_t TxHash[32]; +typedef Hash NoteId; // Opaque node handle typedef struct LogosBlockchainNode LogosBlockchainNode; @@ -54,12 +55,49 @@ typedef struct { uint64_t amount; } TransferFundsArguments; +// Arguments for channel_deposit (amount-based) +typedef struct { + const HeaderId* optional_tip; + const uint8_t* channel_id; + const uint8_t* funding_public_key; + uint64_t amount; + const uint8_t* metadata; + size_t metadata_len; +} ChannelDepositArguments; + +// Arguments for channel_deposit_with_notes (note-based) +typedef struct { + const HeaderId* optional_tip; + const uint8_t* channel_id; + const NoteId* input_note_ids; + size_t input_note_ids_len; + const uint8_t* metadata; + size_t metadata_len; + const uint8_t* change_public_key; + const uint8_t* const* funding_public_keys; + size_t funding_public_keys_len; + uint64_t max_tx_fee; +} ChannelDepositWithNotesArguments; + // Known addresses result container typedef struct { uint8_t** addresses; size_t len; } KnownAddresses; +// A single spendable wallet note (UTXO): its note ID and value. +typedef struct { + NoteId id; + uint64_t value; +} WalletNote; + +// The set of spendable notes for a wallet address at a given tip. +typedef struct { + HeaderId tip; + WalletNote* notes; + size_t len; +} WalletNotes; + // Cryptarchia consensus info typedef struct { uint8_t lib[32]; @@ -74,7 +112,9 @@ typedef struct { LogosBlockchainNode* value; OperationStatus error; } NodeResult typedef struct { uint64_t value; OperationStatus error; } BalanceResult; typedef struct { Hash value; OperationStatus error; } TransferHashResult; typedef struct { TxHash value; OperationStatus error; } FfiLeaderClaimResult; +typedef struct { Hash value; OperationStatus error; } FfiChannelDepositResult; typedef struct { KnownAddresses value; OperationStatus error; } KnownAddressesResult; +typedef struct { WalletNotes value; OperationStatus error; } FfiWalletNotesResult; typedef struct { Hash value; OperationStatus error; } BlendHashResult; typedef struct { char* value; OperationStatus error; } StringResult; typedef struct { CryptarchiaInfo* value; OperationStatus error; } CryptarchiaInfoResult; @@ -130,6 +170,17 @@ TransferHashResult transfer_funds(LogosBlockchainNode* node, const TransferFunds FfiLeaderClaimResult leader_claim(LogosBlockchainNode* node); KnownAddressesResult get_known_addresses(LogosBlockchainNode* node); OperationStatus free_known_addresses(KnownAddresses addrs); +FfiWalletNotesResult get_wallet_notes( + LogosBlockchainNode* node, + const uint8_t* wallet_address, + const HeaderId* optional_tip); +OperationStatus free_wallet_notes(WalletNotes notes); + +// Channel +FfiChannelDepositResult channel_deposit(LogosBlockchainNode* node, const ChannelDepositArguments* arguments); +FfiChannelDepositResult channel_deposit_with_notes( + LogosBlockchainNode* node, + const ChannelDepositWithNotesArguments* arguments); // Blend BlendHashResult blend_join_as_core_node( diff --git a/tests/test_blockchain.cpp b/tests/test_blockchain.cpp index 4156c0d..73be8d0 100644 --- a/tests/test_blockchain.cpp +++ b/tests/test_blockchain.cpp @@ -156,6 +156,31 @@ LOGOS_TEST(leader_claim_without_node_returns_error) { LOGOS_ASSERT_TRUE(contains(result, "not running")); } +LOGOS_TEST(channel_deposit_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + std::string result = module.channel_deposit(VALID_HEX, VALID_HEX, "100", "", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "not running")); +} + +LOGOS_TEST(channel_deposit_with_notes_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + std::string result = module.channel_deposit_with_notes( + VALID_HEX, {VALID_HEX}, "", VALID_HEX, {VALID_HEX}, "0", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "not running")); +} + +LOGOS_TEST(wallet_get_notes_without_node_returns_error) { + auto t = LogosTestContext("blockchain_module"); + LogosBlockchainModule module; + std::string result = module.wallet_get_notes(VALID_HEX, ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "not running")); +} + LOGOS_TEST(wallet_get_known_addresses_without_node_returns_empty) { auto t = LogosTestContext("blockchain_module"); LogosBlockchainModule module; @@ -535,6 +560,267 @@ LOGOS_TEST(leader_claim_returns_error_on_ffi_failure) { delete module; } +LOGOS_TEST(channel_deposit_returns_tx_hash) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("channel_deposit_error").returns(0); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "500", "", ""); + LOGOS_ASSERT_FALSE(starts_with(result, "Error:")); + LOGOS_ASSERT_EQ(static_cast(result.length()), 64); + LOGOS_ASSERT_TRUE(starts_with(result, "bc")); + LOGOS_ASSERT(t.cFunctionCalled("channel_deposit")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_metadata_and_tip) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("channel_deposit_error").returns(0); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "100", "deadbeef", VALID_HEX); + LOGOS_ASSERT_FALSE(starts_with(result, "Error:")); + LOGOS_ASSERT_EQ(static_cast(result.length()), 64); + delete module; +} + +LOGOS_TEST(channel_deposit_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("channel_deposit_error").returns(1); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "100", "", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "Failed to deposit into channel")); + delete module; +} + +LOGOS_TEST(channel_deposit_rejects_invalid_amount) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "not_a_number", "", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "amount")); + delete module; +} + +LOGOS_TEST(channel_deposit_rejects_zero_amount) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "0", "", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "amount")); + delete module; +} + +LOGOS_TEST(channel_deposit_rejects_invalid_channel_id) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit("bad", VALID_HEX, "100", "", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "channel_id")); + delete module; +} + +LOGOS_TEST(channel_deposit_rejects_invalid_funding_key) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit(VALID_HEX, "short", "100", "", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "funding_public_key")); + delete module; +} + +LOGOS_TEST(channel_deposit_rejects_invalid_metadata) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "100", "xyz", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "metadata")); + delete module; +} + +LOGOS_TEST(channel_deposit_rejects_invalid_optional_tip) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit(VALID_HEX, VALID_HEX, "100", "", "bad_tip"); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "tip")); + delete module; +} + +LOGOS_TEST(wallet_get_notes_returns_json_on_success) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_wallet_notes_error").returns(0); + t.mockCFunction("get_wallet_notes_count").returns(2); + + std::string result = module->wallet_get_notes(VALID_HEX, ""); + LOGOS_ASSERT_FALSE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "\"tip\"")); + LOGOS_ASSERT_TRUE(contains(result, "\"notes\"")); + LOGOS_ASSERT_TRUE(contains(result, "\"value\":\"100\"")); + LOGOS_ASSERT_TRUE(contains(result, "\"value\":\"200\"")); + LOGOS_ASSERT(t.cFunctionCalled("get_wallet_notes")); + LOGOS_ASSERT(t.cFunctionCalled("free_wallet_notes")); + delete module; +} + +LOGOS_TEST(wallet_get_notes_returns_empty_notes_array) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_wallet_notes_error").returns(0); + t.mockCFunction("get_wallet_notes_count").returns(0); + + std::string result = module->wallet_get_notes(VALID_HEX, ""); + LOGOS_ASSERT_FALSE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "\"notes\":[]")); + delete module; +} + +LOGOS_TEST(wallet_get_notes_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("get_wallet_notes_error").returns(1); + + std::string result = module->wallet_get_notes(VALID_HEX, ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "Failed to get wallet notes")); + delete module; +} + +LOGOS_TEST(wallet_get_notes_rejects_invalid_address) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->wallet_get_notes("bad", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "wallet address")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_notes_returns_tx_hash) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("channel_deposit_with_notes_error").returns(0); + + std::string result = module->channel_deposit_with_notes( + VALID_HEX, {VALID_HEX}, "deadbeef", VALID_HEX, {VALID_HEX}, "1000", ""); + LOGOS_ASSERT_FALSE(starts_with(result, "Error:")); + LOGOS_ASSERT_EQ(static_cast(result.length()), 64); + LOGOS_ASSERT_TRUE(starts_with(result, "de")); + LOGOS_ASSERT(t.cFunctionCalled("channel_deposit_with_notes")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_notes_returns_error_on_ffi_failure) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + t.mockCFunction("channel_deposit_with_notes_error").returns(1); + + std::string result = module->channel_deposit_with_notes( + VALID_HEX, {VALID_HEX}, "", VALID_HEX, {VALID_HEX}, "0", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "Failed to deposit into channel")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_notes_rejects_empty_notes) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit_with_notes( + VALID_HEX, {}, "", VALID_HEX, {VALID_HEX}, "0", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "input note")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_notes_rejects_invalid_note_id) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit_with_notes( + VALID_HEX, {"bad"}, "", VALID_HEX, {VALID_HEX}, "0", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "input note id")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_notes_rejects_empty_funding_keys) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit_with_notes( + VALID_HEX, {VALID_HEX}, "", VALID_HEX, {}, "0", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "funding public key")); + delete module; +} + +LOGOS_TEST(channel_deposit_with_notes_rejects_invalid_max_tx_fee) { + auto t = LogosTestContext("blockchain_module"); + TempDir tmpDir; + auto* module = createStartedModule(t, tmpDir); + LOGOS_ASSERT_TRUE(module != nullptr); + + std::string result = module->channel_deposit_with_notes( + VALID_HEX, {VALID_HEX}, "", VALID_HEX, {VALID_HEX}, "not_a_number", ""); + LOGOS_ASSERT_TRUE(starts_with(result, "Error:")); + LOGOS_ASSERT_TRUE(contains(result, "max_tx_fee")); + delete module; +} + LOGOS_TEST(wallet_transfer_funds_single_sender_via_vector) { auto t = LogosTestContext("blockchain_module"); TempDir tmpDir;