From ae52613279832140965f33c4f92db65b4b608527 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt <3esmit@gmail.com> Date: Wed, 15 Jul 2026 11:55:53 -0300 Subject: [PATCH] refactor(amm-ui): use shared wallet modules Replace AMM-local wallet access, account state, controls, and confirmation-dialog mechanics with the reusable wallet targets. Keep AMM-specific transaction summaries and actions in the AMM UI.\n\nRefs #227 --- apps/amm/CMakeLists.txt | 19 +- apps/amm/flake.lock | 937 +++++++++--------- apps/amm/flake.nix | 32 +- apps/amm/qml/Logos/Wallet/qmldir | 5 + apps/amm/qml/NavBar.qml | 11 +- .../liquidity/LiquidityConfirmationDialog.qml | 238 ----- .../LiquidityConfirmationSummary.qml | 91 ++ .../swap/SwapConfirmationDialog.qml | 225 ----- .../swap/SwapConfirmationSummary.qml | 88 ++ .../qml/components/wallet/AccountControl.qml | 490 --------- .../qml/components/wallet/AccountDelegate.qml | 84 -- .../components/wallet/CreateAccountDialog.qml | 102 -- .../components/wallet/CreateWalletDialog.qml | 201 ---- .../qml/components/wallet/LogosCopyButton.qml | 39 - .../components/wallet/WalletIconButton.qml | 25 - .../qml/components/wallet/icons/account.svg | 1 - apps/amm/qml/components/wallet/icons/back.svg | 1 - .../qml/components/wallet/icons/checkmark.svg | 1 - apps/amm/qml/components/wallet/icons/copy.svg | 1 - .../amm/qml/components/wallet/icons/power.svg | 1 - .../qml/components/wallet/icons/settings.svg | 1 - apps/amm/qml/pages/LiquidityPage.qml | 15 +- apps/amm/qml/pages/SwapPage.qml | 42 +- apps/amm/src/AccountModel.cpp | 79 -- apps/amm/src/AccountModel.h | 47 - apps/amm/src/AmmUiBackend.cpp | 379 +++---- apps/amm/src/AmmUiBackend.h | 39 +- apps/amm/src/AmmUiBackend.rep | 6 - 28 files changed, 870 insertions(+), 2330 deletions(-) create mode 100644 apps/amm/qml/Logos/Wallet/qmldir delete mode 100644 apps/amm/qml/components/liquidity/LiquidityConfirmationDialog.qml create mode 100644 apps/amm/qml/components/liquidity/LiquidityConfirmationSummary.qml delete mode 100644 apps/amm/qml/components/swap/SwapConfirmationDialog.qml create mode 100644 apps/amm/qml/components/swap/SwapConfirmationSummary.qml delete mode 100644 apps/amm/qml/components/wallet/AccountControl.qml delete mode 100644 apps/amm/qml/components/wallet/AccountDelegate.qml delete mode 100644 apps/amm/qml/components/wallet/CreateAccountDialog.qml delete mode 100644 apps/amm/qml/components/wallet/CreateWalletDialog.qml delete mode 100644 apps/amm/qml/components/wallet/LogosCopyButton.qml delete mode 100644 apps/amm/qml/components/wallet/WalletIconButton.qml delete mode 100644 apps/amm/qml/components/wallet/icons/account.svg delete mode 100644 apps/amm/qml/components/wallet/icons/back.svg delete mode 100644 apps/amm/qml/components/wallet/icons/checkmark.svg delete mode 100644 apps/amm/qml/components/wallet/icons/copy.svg delete mode 100644 apps/amm/qml/components/wallet/icons/power.svg delete mode 100644 apps/amm/qml/components/wallet/icons/settings.svg delete mode 100644 apps/amm/src/AccountModel.cpp delete mode 100644 apps/amm/src/AccountModel.h diff --git a/apps/amm/CMakeLists.txt b/apps/amm/CMakeLists.txt index 10f4346..38c8081 100644 --- a/apps/amm/CMakeLists.txt +++ b/apps/amm/CMakeLists.txt @@ -1,12 +1,25 @@ -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.21) project(AmmUiPlugin LANGUAGES CXX) +find_package(Qt6 6.8 REQUIRED COMPONENTS Core Gui Network Qml Quick QuickControls2) +qt_standard_project_setup(REQUIRES 6.8) + if(DEFINED ENV{LOGOS_MODULE_BUILDER_ROOT}) include($ENV{LOGOS_MODULE_BUILDER_ROOT}/cmake/LogosModule.cmake) else() message(FATAL_ERROR "LogosModule.cmake not found. Set LOGOS_MODULE_BUILDER_ROOT.") endif() +set(LOGOS_WALLET_SOURCE_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/../shared/wallet" + CACHE PATH "Path to the shared Logos wallet module" +) +set(LOGOS_WALLET_GENERATED_DIR + "${CMAKE_CURRENT_SOURCE_DIR}/generated_code" + CACHE PATH "Path to generated Logos SDK sources" +) +add_subdirectory("${LOGOS_WALLET_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/shared-wallet") + # ui_qml module with a hand-written C++ backend (QtRO .rep view contract + # generated *SimpleSource/*ViewPluginBase). Mirrors the LEZ wallet UI module. logos_module( @@ -18,12 +31,12 @@ logos_module( src/AmmUiPlugin.cpp src/AmmUiBackend.h src/AmmUiBackend.cpp - src/AccountModel.h - src/AccountModel.cpp FIND_PACKAGES Qt6Gui Qt6Network LINK_LIBRARIES Qt6::Gui Qt6::Network + LINK_TARGETS + logos_wallet_access ) diff --git a/apps/amm/flake.lock b/apps/amm/flake.lock index 9bc7175..e0014b3 100644 --- a/apps/amm/flake.lock +++ b/apps/amm/flake.lock @@ -1,6 +1,6 @@ { "nodes": { - "crane": { + "crane_2": { "locked": { "lastModified": 1780532242, "narHash": "sha256-D+BsdpxmtUwtqGoY0IXPhHgTlmqgcZKCEo1oMyn7ep0=", @@ -76,7 +76,7 @@ }, "logos-blockchain-circuits": { "inputs": { - "nixpkgs": "nixpkgs_124" + "nixpkgs": "nixpkgs_125" }, "locked": { "lastModified": 1781004244, @@ -2225,7 +2225,7 @@ }, "logos-execution-zone": { "inputs": { - "crane": "crane", + "crane": "crane_2", "logos-blockchain-circuits": "logos-blockchain-circuits", "logos-liblogos": "logos-liblogos_4", "nixpkgs": [ @@ -2238,17 +2238,17 @@ "rust-rapidsnark": "rust-rapidsnark" }, "locked": { - "lastModified": 1782310268, - "narHash": "sha256-tIIIO+V+w/C/KLtKnLIv8O8/GoJ4PzgJSWrlQCXJ2P4=", + "lastModified": 1782428741, + "narHash": "sha256-ltLcysXUdVUXAe25Tl8x7e7ZsTzj1sHlyS3glp97TAo=", "owner": "logos-blockchain", - "repo": "lssa", - "rev": "fb8cbac40e0bda4f152415ff4f181cdc6bca6d4a", + "repo": "logos-execution-zone", + "rev": "e37876a64028a335eb693198a1ed6a0e875ec5b4", "type": "github" }, "original": { "owner": "logos-blockchain", - "repo": "lssa", - "rev": "fb8cbac40e0bda4f152415ff4f181cdc6bca6d4a", + "repo": "logos-execution-zone", + "rev": "e37876a64028a335eb693198a1ed6a0e875ec5b4", "type": "github" } }, @@ -4763,7 +4763,7 @@ }, "logos-nix": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs_2" }, "locked": { "lastModified": 1774455309, @@ -4781,7 +4781,7 @@ }, "logos-nix_10": { "inputs": { - "nixpkgs": "nixpkgs_10" + "nixpkgs": "nixpkgs_11" }, "locked": { "lastModified": 1774455309, @@ -4799,7 +4799,7 @@ }, "logos-nix_100": { "inputs": { - "nixpkgs": "nixpkgs_100" + "nixpkgs": "nixpkgs_101" }, "locked": { "lastModified": 1773955630, @@ -4817,7 +4817,7 @@ }, "logos-nix_101": { "inputs": { - "nixpkgs": "nixpkgs_101" + "nixpkgs": "nixpkgs_102" }, "locked": { "lastModified": 1773955630, @@ -4835,7 +4835,7 @@ }, "logos-nix_102": { "inputs": { - "nixpkgs": "nixpkgs_102" + "nixpkgs": "nixpkgs_103" }, "locked": { "lastModified": 1773955630, @@ -4853,7 +4853,7 @@ }, "logos-nix_103": { "inputs": { - "nixpkgs": "nixpkgs_103" + "nixpkgs": "nixpkgs_104" }, "locked": { "lastModified": 1773955630, @@ -4871,7 +4871,7 @@ }, "logos-nix_104": { "inputs": { - "nixpkgs": "nixpkgs_104" + "nixpkgs": "nixpkgs_105" }, "locked": { "lastModified": 1773955630, @@ -4889,7 +4889,7 @@ }, "logos-nix_105": { "inputs": { - "nixpkgs": "nixpkgs_105" + "nixpkgs": "nixpkgs_106" }, "locked": { "lastModified": 1774455309, @@ -4907,7 +4907,7 @@ }, "logos-nix_106": { "inputs": { - "nixpkgs": "nixpkgs_106" + "nixpkgs": "nixpkgs_107" }, "locked": { "lastModified": 1773955630, @@ -4925,7 +4925,7 @@ }, "logos-nix_107": { "inputs": { - "nixpkgs": "nixpkgs_107" + "nixpkgs": "nixpkgs_108" }, "locked": { "lastModified": 1774455309, @@ -4943,7 +4943,7 @@ }, "logos-nix_108": { "inputs": { - "nixpkgs": "nixpkgs_108" + "nixpkgs": "nixpkgs_109" }, "locked": { "lastModified": 1774455309, @@ -4961,7 +4961,7 @@ }, "logos-nix_109": { "inputs": { - "nixpkgs": "nixpkgs_109" + "nixpkgs": "nixpkgs_110" }, "locked": { "lastModified": 1773955630, @@ -4979,7 +4979,7 @@ }, "logos-nix_11": { "inputs": { - "nixpkgs": "nixpkgs_11" + "nixpkgs": "nixpkgs_12" }, "locked": { "lastModified": 1773955630, @@ -4997,7 +4997,7 @@ }, "logos-nix_110": { "inputs": { - "nixpkgs": "nixpkgs_110" + "nixpkgs": "nixpkgs_111" }, "locked": { "lastModified": 1773955630, @@ -5015,7 +5015,7 @@ }, "logos-nix_111": { "inputs": { - "nixpkgs": "nixpkgs_111" + "nixpkgs": "nixpkgs_112" }, "locked": { "lastModified": 1774455309, @@ -5033,7 +5033,7 @@ }, "logos-nix_112": { "inputs": { - "nixpkgs": "nixpkgs_112" + "nixpkgs": "nixpkgs_113" }, "locked": { "lastModified": 1774455309, @@ -5051,7 +5051,7 @@ }, "logos-nix_113": { "inputs": { - "nixpkgs": "nixpkgs_113" + "nixpkgs": "nixpkgs_114" }, "locked": { "lastModified": 1773955630, @@ -5069,7 +5069,7 @@ }, "logos-nix_114": { "inputs": { - "nixpkgs": "nixpkgs_114" + "nixpkgs": "nixpkgs_115" }, "locked": { "lastModified": 1773955630, @@ -5087,7 +5087,7 @@ }, "logos-nix_115": { "inputs": { - "nixpkgs": "nixpkgs_115" + "nixpkgs": "nixpkgs_116" }, "locked": { "lastModified": 1774455309, @@ -5105,7 +5105,7 @@ }, "logos-nix_116": { "inputs": { - "nixpkgs": "nixpkgs_116" + "nixpkgs": "nixpkgs_117" }, "locked": { "lastModified": 1774455309, @@ -5123,7 +5123,7 @@ }, "logos-nix_117": { "inputs": { - "nixpkgs": "nixpkgs_117" + "nixpkgs": "nixpkgs_118" }, "locked": { "lastModified": 1773955630, @@ -5141,7 +5141,7 @@ }, "logos-nix_118": { "inputs": { - "nixpkgs": "nixpkgs_118" + "nixpkgs": "nixpkgs_119" }, "locked": { "lastModified": 1773955630, @@ -5159,7 +5159,7 @@ }, "logos-nix_119": { "inputs": { - "nixpkgs": "nixpkgs_119" + "nixpkgs": "nixpkgs_120" }, "locked": { "lastModified": 1773955630, @@ -5177,7 +5177,7 @@ }, "logos-nix_12": { "inputs": { - "nixpkgs": "nixpkgs_12" + "nixpkgs": "nixpkgs_13" }, "locked": { "lastModified": 1774455309, @@ -5195,7 +5195,7 @@ }, "logos-nix_120": { "inputs": { - "nixpkgs": "nixpkgs_120" + "nixpkgs": "nixpkgs_121" }, "locked": { "lastModified": 1773955630, @@ -5213,7 +5213,7 @@ }, "logos-nix_121": { "inputs": { - "nixpkgs": "nixpkgs_121" + "nixpkgs": "nixpkgs_122" }, "locked": { "lastModified": 1774455309, @@ -5231,7 +5231,7 @@ }, "logos-nix_122": { "inputs": { - "nixpkgs": "nixpkgs_122" + "nixpkgs": "nixpkgs_123" }, "locked": { "lastModified": 1773955630, @@ -5249,7 +5249,7 @@ }, "logos-nix_123": { "inputs": { - "nixpkgs": "nixpkgs_123" + "nixpkgs": "nixpkgs_124" }, "locked": { "lastModified": 1773955630, @@ -5267,7 +5267,7 @@ }, "logos-nix_124": { "inputs": { - "nixpkgs": "nixpkgs_125" + "nixpkgs": "nixpkgs_126" }, "locked": { "lastModified": 1774455309, @@ -5285,7 +5285,7 @@ }, "logos-nix_125": { "inputs": { - "nixpkgs": "nixpkgs_126" + "nixpkgs": "nixpkgs_127" }, "locked": { "lastModified": 1774455309, @@ -5303,7 +5303,7 @@ }, "logos-nix_126": { "inputs": { - "nixpkgs": "nixpkgs_127" + "nixpkgs": "nixpkgs_128" }, "locked": { "lastModified": 1774455309, @@ -5321,7 +5321,7 @@ }, "logos-nix_127": { "inputs": { - "nixpkgs": "nixpkgs_128" + "nixpkgs": "nixpkgs_129" }, "locked": { "lastModified": 1774455309, @@ -5339,7 +5339,7 @@ }, "logos-nix_128": { "inputs": { - "nixpkgs": "nixpkgs_129" + "nixpkgs": "nixpkgs_130" }, "locked": { "lastModified": 1773955630, @@ -5357,7 +5357,7 @@ }, "logos-nix_129": { "inputs": { - "nixpkgs": "nixpkgs_130" + "nixpkgs": "nixpkgs_131" }, "locked": { "lastModified": 1774455309, @@ -5375,7 +5375,7 @@ }, "logos-nix_13": { "inputs": { - "nixpkgs": "nixpkgs_13" + "nixpkgs": "nixpkgs_14" }, "locked": { "lastModified": 1773955630, @@ -5393,7 +5393,7 @@ }, "logos-nix_130": { "inputs": { - "nixpkgs": "nixpkgs_131" + "nixpkgs": "nixpkgs_132" }, "locked": { "lastModified": 1774455309, @@ -5411,7 +5411,7 @@ }, "logos-nix_131": { "inputs": { - "nixpkgs": "nixpkgs_132" + "nixpkgs": "nixpkgs_133" }, "locked": { "lastModified": 1774455309, @@ -5429,7 +5429,7 @@ }, "logos-nix_132": { "inputs": { - "nixpkgs": "nixpkgs_133" + "nixpkgs": "nixpkgs_134" }, "locked": { "lastModified": 1774455309, @@ -5447,7 +5447,7 @@ }, "logos-nix_133": { "inputs": { - "nixpkgs": "nixpkgs_134" + "nixpkgs": "nixpkgs_135" }, "locked": { "lastModified": 1774455309, @@ -5465,7 +5465,7 @@ }, "logos-nix_134": { "inputs": { - "nixpkgs": "nixpkgs_135" + "nixpkgs": "nixpkgs_136" }, "locked": { "lastModified": 1774455309, @@ -5483,7 +5483,7 @@ }, "logos-nix_135": { "inputs": { - "nixpkgs": "nixpkgs_136" + "nixpkgs": "nixpkgs_137" }, "locked": { "lastModified": 1773955630, @@ -5501,7 +5501,7 @@ }, "logos-nix_136": { "inputs": { - "nixpkgs": "nixpkgs_137" + "nixpkgs": "nixpkgs_138" }, "locked": { "lastModified": 1774455309, @@ -5519,7 +5519,7 @@ }, "logos-nix_137": { "inputs": { - "nixpkgs": "nixpkgs_138" + "nixpkgs": "nixpkgs_139" }, "locked": { "lastModified": 1773955630, @@ -5537,7 +5537,7 @@ }, "logos-nix_138": { "inputs": { - "nixpkgs": "nixpkgs_139" + "nixpkgs": "nixpkgs_140" }, "locked": { "lastModified": 1774455309, @@ -5555,7 +5555,7 @@ }, "logos-nix_139": { "inputs": { - "nixpkgs": "nixpkgs_140" + "nixpkgs": "nixpkgs_141" }, "locked": { "lastModified": 1773955630, @@ -5573,7 +5573,7 @@ }, "logos-nix_14": { "inputs": { - "nixpkgs": "nixpkgs_14" + "nixpkgs": "nixpkgs_15" }, "locked": { "lastModified": 1774455309, @@ -5591,7 +5591,7 @@ }, "logos-nix_140": { "inputs": { - "nixpkgs": "nixpkgs_141" + "nixpkgs": "nixpkgs_142" }, "locked": { "lastModified": 1774455309, @@ -5609,7 +5609,7 @@ }, "logos-nix_141": { "inputs": { - "nixpkgs": "nixpkgs_142" + "nixpkgs": "nixpkgs_143" }, "locked": { "lastModified": 1774455309, @@ -5627,7 +5627,7 @@ }, "logos-nix_142": { "inputs": { - "nixpkgs": "nixpkgs_143" + "nixpkgs": "nixpkgs_144" }, "locked": { "lastModified": 1773955630, @@ -5645,7 +5645,7 @@ }, "logos-nix_143": { "inputs": { - "nixpkgs": "nixpkgs_144" + "nixpkgs": "nixpkgs_145" }, "locked": { "lastModified": 1774455309, @@ -5663,7 +5663,7 @@ }, "logos-nix_144": { "inputs": { - "nixpkgs": "nixpkgs_145" + "nixpkgs": "nixpkgs_146" }, "locked": { "lastModified": 1773955630, @@ -5681,7 +5681,7 @@ }, "logos-nix_145": { "inputs": { - "nixpkgs": "nixpkgs_146" + "nixpkgs": "nixpkgs_147" }, "locked": { "lastModified": 1774455309, @@ -5699,7 +5699,7 @@ }, "logos-nix_146": { "inputs": { - "nixpkgs": "nixpkgs_147" + "nixpkgs": "nixpkgs_148" }, "locked": { "lastModified": 1773955630, @@ -5717,7 +5717,7 @@ }, "logos-nix_147": { "inputs": { - "nixpkgs": "nixpkgs_148" + "nixpkgs": "nixpkgs_149" }, "locked": { "lastModified": 1774455309, @@ -5735,7 +5735,7 @@ }, "logos-nix_148": { "inputs": { - "nixpkgs": "nixpkgs_149" + "nixpkgs": "nixpkgs_150" }, "locked": { "lastModified": 1773955630, @@ -5753,7 +5753,7 @@ }, "logos-nix_149": { "inputs": { - "nixpkgs": "nixpkgs_150" + "nixpkgs": "nixpkgs_151" }, "locked": { "lastModified": 1773955630, @@ -5771,7 +5771,7 @@ }, "logos-nix_15": { "inputs": { - "nixpkgs": "nixpkgs_15" + "nixpkgs": "nixpkgs_16" }, "locked": { "lastModified": 1773955630, @@ -5789,7 +5789,7 @@ }, "logos-nix_150": { "inputs": { - "nixpkgs": "nixpkgs_151" + "nixpkgs": "nixpkgs_152" }, "locked": { "lastModified": 1774455309, @@ -5807,7 +5807,7 @@ }, "logos-nix_151": { "inputs": { - "nixpkgs": "nixpkgs_152" + "nixpkgs": "nixpkgs_153" }, "locked": { "lastModified": 1773955630, @@ -5825,7 +5825,7 @@ }, "logos-nix_152": { "inputs": { - "nixpkgs": "nixpkgs_153" + "nixpkgs": "nixpkgs_154" }, "locked": { "lastModified": 1773955630, @@ -5843,7 +5843,7 @@ }, "logos-nix_153": { "inputs": { - "nixpkgs": "nixpkgs_154" + "nixpkgs": "nixpkgs_155" }, "locked": { "lastModified": 1773955630, @@ -5861,7 +5861,7 @@ }, "logos-nix_154": { "inputs": { - "nixpkgs": "nixpkgs_155" + "nixpkgs": "nixpkgs_156" }, "locked": { "lastModified": 1773955630, @@ -5879,7 +5879,7 @@ }, "logos-nix_155": { "inputs": { - "nixpkgs": "nixpkgs_156" + "nixpkgs": "nixpkgs_157" }, "locked": { "lastModified": 1774455309, @@ -5897,7 +5897,7 @@ }, "logos-nix_156": { "inputs": { - "nixpkgs": "nixpkgs_157" + "nixpkgs": "nixpkgs_158" }, "locked": { "lastModified": 1773955630, @@ -5915,7 +5915,7 @@ }, "logos-nix_157": { "inputs": { - "nixpkgs": "nixpkgs_158" + "nixpkgs": "nixpkgs_159" }, "locked": { "lastModified": 1774455309, @@ -5933,7 +5933,7 @@ }, "logos-nix_158": { "inputs": { - "nixpkgs": "nixpkgs_159" + "nixpkgs": "nixpkgs_160" }, "locked": { "lastModified": 1774455309, @@ -5951,7 +5951,7 @@ }, "logos-nix_159": { "inputs": { - "nixpkgs": "nixpkgs_160" + "nixpkgs": "nixpkgs_161" }, "locked": { "lastModified": 1773955630, @@ -5969,7 +5969,7 @@ }, "logos-nix_16": { "inputs": { - "nixpkgs": "nixpkgs_16" + "nixpkgs": "nixpkgs_17" }, "locked": { "lastModified": 1774455309, @@ -5987,7 +5987,7 @@ }, "logos-nix_160": { "inputs": { - "nixpkgs": "nixpkgs_161" + "nixpkgs": "nixpkgs_162" }, "locked": { "lastModified": 1773955630, @@ -6005,7 +6005,7 @@ }, "logos-nix_161": { "inputs": { - "nixpkgs": "nixpkgs_162" + "nixpkgs": "nixpkgs_163" }, "locked": { "lastModified": 1773955630, @@ -6023,7 +6023,7 @@ }, "logos-nix_162": { "inputs": { - "nixpkgs": "nixpkgs_163" + "nixpkgs": "nixpkgs_164" }, "locked": { "lastModified": 1773955630, @@ -6041,7 +6041,7 @@ }, "logos-nix_163": { "inputs": { - "nixpkgs": "nixpkgs_164" + "nixpkgs": "nixpkgs_165" }, "locked": { "lastModified": 1773955630, @@ -6059,7 +6059,7 @@ }, "logos-nix_164": { "inputs": { - "nixpkgs": "nixpkgs_165" + "nixpkgs": "nixpkgs_166" }, "locked": { "lastModified": 1774455309, @@ -6077,7 +6077,7 @@ }, "logos-nix_165": { "inputs": { - "nixpkgs": "nixpkgs_166" + "nixpkgs": "nixpkgs_167" }, "locked": { "lastModified": 1773955630, @@ -6095,7 +6095,7 @@ }, "logos-nix_166": { "inputs": { - "nixpkgs": "nixpkgs_167" + "nixpkgs": "nixpkgs_168" }, "locked": { "lastModified": 1774455309, @@ -6113,7 +6113,7 @@ }, "logos-nix_167": { "inputs": { - "nixpkgs": "nixpkgs_168" + "nixpkgs": "nixpkgs_169" }, "locked": { "lastModified": 1774455309, @@ -6131,7 +6131,7 @@ }, "logos-nix_168": { "inputs": { - "nixpkgs": "nixpkgs_169" + "nixpkgs": "nixpkgs_170" }, "locked": { "lastModified": 1773955630, @@ -6149,7 +6149,7 @@ }, "logos-nix_169": { "inputs": { - "nixpkgs": "nixpkgs_170" + "nixpkgs": "nixpkgs_171" }, "locked": { "lastModified": 1773955630, @@ -6167,7 +6167,7 @@ }, "logos-nix_17": { "inputs": { - "nixpkgs": "nixpkgs_17" + "nixpkgs": "nixpkgs_18" }, "locked": { "lastModified": 1773955630, @@ -6185,7 +6185,7 @@ }, "logos-nix_170": { "inputs": { - "nixpkgs": "nixpkgs_171" + "nixpkgs": "nixpkgs_172" }, "locked": { "lastModified": 1774455309, @@ -6203,7 +6203,7 @@ }, "logos-nix_171": { "inputs": { - "nixpkgs": "nixpkgs_172" + "nixpkgs": "nixpkgs_173" }, "locked": { "lastModified": 1774455309, @@ -6221,7 +6221,7 @@ }, "logos-nix_172": { "inputs": { - "nixpkgs": "nixpkgs_173" + "nixpkgs": "nixpkgs_174" }, "locked": { "lastModified": 1773955630, @@ -6239,7 +6239,7 @@ }, "logos-nix_173": { "inputs": { - "nixpkgs": "nixpkgs_174" + "nixpkgs": "nixpkgs_175" }, "locked": { "lastModified": 1773955630, @@ -6257,7 +6257,7 @@ }, "logos-nix_174": { "inputs": { - "nixpkgs": "nixpkgs_175" + "nixpkgs": "nixpkgs_176" }, "locked": { "lastModified": 1774455309, @@ -6275,7 +6275,7 @@ }, "logos-nix_175": { "inputs": { - "nixpkgs": "nixpkgs_176" + "nixpkgs": "nixpkgs_177" }, "locked": { "lastModified": 1774455309, @@ -6293,7 +6293,7 @@ }, "logos-nix_176": { "inputs": { - "nixpkgs": "nixpkgs_177" + "nixpkgs": "nixpkgs_178" }, "locked": { "lastModified": 1773955630, @@ -6311,7 +6311,7 @@ }, "logos-nix_177": { "inputs": { - "nixpkgs": "nixpkgs_178" + "nixpkgs": "nixpkgs_179" }, "locked": { "lastModified": 1773955630, @@ -6329,7 +6329,7 @@ }, "logos-nix_178": { "inputs": { - "nixpkgs": "nixpkgs_179" + "nixpkgs": "nixpkgs_180" }, "locked": { "lastModified": 1773955630, @@ -6347,7 +6347,7 @@ }, "logos-nix_179": { "inputs": { - "nixpkgs": "nixpkgs_180" + "nixpkgs": "nixpkgs_181" }, "locked": { "lastModified": 1773955630, @@ -6365,7 +6365,7 @@ }, "logos-nix_18": { "inputs": { - "nixpkgs": "nixpkgs_18" + "nixpkgs": "nixpkgs_19" }, "locked": { "lastModified": 1773955630, @@ -6383,7 +6383,7 @@ }, "logos-nix_180": { "inputs": { - "nixpkgs": "nixpkgs_181" + "nixpkgs": "nixpkgs_182" }, "locked": { "lastModified": 1774455309, @@ -6401,7 +6401,7 @@ }, "logos-nix_181": { "inputs": { - "nixpkgs": "nixpkgs_182" + "nixpkgs": "nixpkgs_183" }, "locked": { "lastModified": 1773955630, @@ -6419,7 +6419,7 @@ }, "logos-nix_182": { "inputs": { - "nixpkgs": "nixpkgs_183" + "nixpkgs": "nixpkgs_184" }, "locked": { "lastModified": 1773955630, @@ -6437,7 +6437,7 @@ }, "logos-nix_183": { "inputs": { - "nixpkgs": "nixpkgs_184" + "nixpkgs": "nixpkgs_185" }, "locked": { "lastModified": 1774455309, @@ -6455,7 +6455,7 @@ }, "logos-nix_184": { "inputs": { - "nixpkgs": "nixpkgs_185" + "nixpkgs": "nixpkgs_186" }, "locked": { "lastModified": 1773955630, @@ -6473,7 +6473,7 @@ }, "logos-nix_185": { "inputs": { - "nixpkgs": "nixpkgs_186" + "nixpkgs": "nixpkgs_187" }, "locked": { "lastModified": 1774455309, @@ -6491,7 +6491,7 @@ }, "logos-nix_186": { "inputs": { - "nixpkgs": "nixpkgs_187" + "nixpkgs": "nixpkgs_188" }, "locked": { "lastModified": 1773955630, @@ -6509,7 +6509,7 @@ }, "logos-nix_187": { "inputs": { - "nixpkgs": "nixpkgs_188" + "nixpkgs": "nixpkgs_189" }, "locked": { "lastModified": 1774455309, @@ -6527,7 +6527,7 @@ }, "logos-nix_188": { "inputs": { - "nixpkgs": "nixpkgs_189" + "nixpkgs": "nixpkgs_190" }, "locked": { "lastModified": 1773955630, @@ -6545,7 +6545,7 @@ }, "logos-nix_189": { "inputs": { - "nixpkgs": "nixpkgs_190" + "nixpkgs": "nixpkgs_191" }, "locked": { "lastModified": 1774455309, @@ -6563,7 +6563,7 @@ }, "logos-nix_19": { "inputs": { - "nixpkgs": "nixpkgs_19" + "nixpkgs": "nixpkgs_20" }, "locked": { "lastModified": 1774455309, @@ -6581,7 +6581,7 @@ }, "logos-nix_190": { "inputs": { - "nixpkgs": "nixpkgs_191" + "nixpkgs": "nixpkgs_192" }, "locked": { "lastModified": 1773955630, @@ -6599,7 +6599,7 @@ }, "logos-nix_191": { "inputs": { - "nixpkgs": "nixpkgs_192" + "nixpkgs": "nixpkgs_193" }, "locked": { "lastModified": 1774455309, @@ -6617,7 +6617,7 @@ }, "logos-nix_192": { "inputs": { - "nixpkgs": "nixpkgs_193" + "nixpkgs": "nixpkgs_194" }, "locked": { "lastModified": 1773955630, @@ -6635,7 +6635,7 @@ }, "logos-nix_193": { "inputs": { - "nixpkgs": "nixpkgs_194" + "nixpkgs": "nixpkgs_195" }, "locked": { "lastModified": 1773955630, @@ -6653,7 +6653,7 @@ }, "logos-nix_194": { "inputs": { - "nixpkgs": "nixpkgs_195" + "nixpkgs": "nixpkgs_196" }, "locked": { "lastModified": 1774455309, @@ -6671,7 +6671,7 @@ }, "logos-nix_195": { "inputs": { - "nixpkgs": "nixpkgs_196" + "nixpkgs": "nixpkgs_197" }, "locked": { "lastModified": 1773955630, @@ -6689,7 +6689,7 @@ }, "logos-nix_196": { "inputs": { - "nixpkgs": "nixpkgs_197" + "nixpkgs": "nixpkgs_198" }, "locked": { "lastModified": 1773955630, @@ -6707,7 +6707,7 @@ }, "logos-nix_197": { "inputs": { - "nixpkgs": "nixpkgs_198" + "nixpkgs": "nixpkgs_199" }, "locked": { "lastModified": 1773955630, @@ -6725,7 +6725,7 @@ }, "logos-nix_198": { "inputs": { - "nixpkgs": "nixpkgs_199" + "nixpkgs": "nixpkgs_200" }, "locked": { "lastModified": 1773955630, @@ -6743,7 +6743,7 @@ }, "logos-nix_199": { "inputs": { - "nixpkgs": "nixpkgs_200" + "nixpkgs": "nixpkgs_201" }, "locked": { "lastModified": 1774455309, @@ -6761,7 +6761,7 @@ }, "logos-nix_2": { "inputs": { - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_3" }, "locked": { "lastModified": 1773955630, @@ -6779,7 +6779,7 @@ }, "logos-nix_20": { "inputs": { - "nixpkgs": "nixpkgs_20" + "nixpkgs": "nixpkgs_21" }, "locked": { "lastModified": 1773955630, @@ -6797,7 +6797,7 @@ }, "logos-nix_200": { "inputs": { - "nixpkgs": "nixpkgs_201" + "nixpkgs": "nixpkgs_202" }, "locked": { "lastModified": 1773955630, @@ -6815,7 +6815,7 @@ }, "logos-nix_201": { "inputs": { - "nixpkgs": "nixpkgs_202" + "nixpkgs": "nixpkgs_203" }, "locked": { "lastModified": 1774455309, @@ -6833,7 +6833,7 @@ }, "logos-nix_202": { "inputs": { - "nixpkgs": "nixpkgs_203" + "nixpkgs": "nixpkgs_204" }, "locked": { "lastModified": 1774455309, @@ -6851,7 +6851,7 @@ }, "logos-nix_203": { "inputs": { - "nixpkgs": "nixpkgs_204" + "nixpkgs": "nixpkgs_205" }, "locked": { "lastModified": 1773955630, @@ -6869,7 +6869,7 @@ }, "logos-nix_204": { "inputs": { - "nixpkgs": "nixpkgs_205" + "nixpkgs": "nixpkgs_206" }, "locked": { "lastModified": 1773955630, @@ -6887,7 +6887,7 @@ }, "logos-nix_205": { "inputs": { - "nixpkgs": "nixpkgs_206" + "nixpkgs": "nixpkgs_207" }, "locked": { "lastModified": 1773955630, @@ -6905,7 +6905,7 @@ }, "logos-nix_206": { "inputs": { - "nixpkgs": "nixpkgs_207" + "nixpkgs": "nixpkgs_208" }, "locked": { "lastModified": 1773955630, @@ -6923,7 +6923,7 @@ }, "logos-nix_207": { "inputs": { - "nixpkgs": "nixpkgs_208" + "nixpkgs": "nixpkgs_209" }, "locked": { "lastModified": 1773955630, @@ -6941,7 +6941,7 @@ }, "logos-nix_208": { "inputs": { - "nixpkgs": "nixpkgs_209" + "nixpkgs": "nixpkgs_210" }, "locked": { "lastModified": 1774455309, @@ -6959,7 +6959,7 @@ }, "logos-nix_209": { "inputs": { - "nixpkgs": "nixpkgs_210" + "nixpkgs": "nixpkgs_211" }, "locked": { "lastModified": 1773955630, @@ -6977,7 +6977,7 @@ }, "logos-nix_21": { "inputs": { - "nixpkgs": "nixpkgs_21" + "nixpkgs": "nixpkgs_22" }, "locked": { "lastModified": 1773955630, @@ -6995,7 +6995,7 @@ }, "logos-nix_210": { "inputs": { - "nixpkgs": "nixpkgs_211" + "nixpkgs": "nixpkgs_212" }, "locked": { "lastModified": 1774455309, @@ -7013,7 +7013,7 @@ }, "logos-nix_211": { "inputs": { - "nixpkgs": "nixpkgs_212" + "nixpkgs": "nixpkgs_213" }, "locked": { "lastModified": 1774455309, @@ -7031,7 +7031,7 @@ }, "logos-nix_212": { "inputs": { - "nixpkgs": "nixpkgs_213" + "nixpkgs": "nixpkgs_214" }, "locked": { "lastModified": 1773955630, @@ -7049,7 +7049,7 @@ }, "logos-nix_213": { "inputs": { - "nixpkgs": "nixpkgs_214" + "nixpkgs": "nixpkgs_215" }, "locked": { "lastModified": 1773955630, @@ -7067,7 +7067,7 @@ }, "logos-nix_214": { "inputs": { - "nixpkgs": "nixpkgs_215" + "nixpkgs": "nixpkgs_216" }, "locked": { "lastModified": 1774455309, @@ -7085,7 +7085,7 @@ }, "logos-nix_215": { "inputs": { - "nixpkgs": "nixpkgs_216" + "nixpkgs": "nixpkgs_217" }, "locked": { "lastModified": 1774455309, @@ -7103,7 +7103,7 @@ }, "logos-nix_216": { "inputs": { - "nixpkgs": "nixpkgs_217" + "nixpkgs": "nixpkgs_218" }, "locked": { "lastModified": 1773955630, @@ -7121,7 +7121,7 @@ }, "logos-nix_217": { "inputs": { - "nixpkgs": "nixpkgs_218" + "nixpkgs": "nixpkgs_219" }, "locked": { "lastModified": 1773955630, @@ -7139,7 +7139,7 @@ }, "logos-nix_218": { "inputs": { - "nixpkgs": "nixpkgs_219" + "nixpkgs": "nixpkgs_220" }, "locked": { "lastModified": 1774455309, @@ -7157,7 +7157,7 @@ }, "logos-nix_219": { "inputs": { - "nixpkgs": "nixpkgs_220" + "nixpkgs": "nixpkgs_221" }, "locked": { "lastModified": 1774455309, @@ -7175,7 +7175,7 @@ }, "logos-nix_22": { "inputs": { - "nixpkgs": "nixpkgs_22" + "nixpkgs": "nixpkgs_23" }, "locked": { "lastModified": 1773955630, @@ -7193,7 +7193,7 @@ }, "logos-nix_220": { "inputs": { - "nixpkgs": "nixpkgs_221" + "nixpkgs": "nixpkgs_222" }, "locked": { "lastModified": 1773955630, @@ -7211,7 +7211,7 @@ }, "logos-nix_221": { "inputs": { - "nixpkgs": "nixpkgs_222" + "nixpkgs": "nixpkgs_223" }, "locked": { "lastModified": 1773955630, @@ -7229,7 +7229,7 @@ }, "logos-nix_222": { "inputs": { - "nixpkgs": "nixpkgs_223" + "nixpkgs": "nixpkgs_224" }, "locked": { "lastModified": 1773955630, @@ -7247,7 +7247,7 @@ }, "logos-nix_223": { "inputs": { - "nixpkgs": "nixpkgs_224" + "nixpkgs": "nixpkgs_225" }, "locked": { "lastModified": 1773955630, @@ -7265,7 +7265,7 @@ }, "logos-nix_224": { "inputs": { - "nixpkgs": "nixpkgs_225" + "nixpkgs": "nixpkgs_226" }, "locked": { "lastModified": 1774455309, @@ -7283,7 +7283,7 @@ }, "logos-nix_225": { "inputs": { - "nixpkgs": "nixpkgs_226" + "nixpkgs": "nixpkgs_227" }, "locked": { "lastModified": 1773955630, @@ -7301,7 +7301,7 @@ }, "logos-nix_226": { "inputs": { - "nixpkgs": "nixpkgs_227" + "nixpkgs": "nixpkgs_228" }, "locked": { "lastModified": 1773955630, @@ -7319,7 +7319,7 @@ }, "logos-nix_227": { "inputs": { - "nixpkgs": "nixpkgs_228" + "nixpkgs": "nixpkgs_229" }, "locked": { "lastModified": 1774455309, @@ -7337,7 +7337,7 @@ }, "logos-nix_228": { "inputs": { - "nixpkgs": "nixpkgs_229" + "nixpkgs": "nixpkgs_230" }, "locked": { "lastModified": 1773955630, @@ -7355,7 +7355,7 @@ }, "logos-nix_229": { "inputs": { - "nixpkgs": "nixpkgs_230" + "nixpkgs": "nixpkgs_231" }, "locked": { "lastModified": 1774455309, @@ -7373,7 +7373,7 @@ }, "logos-nix_23": { "inputs": { - "nixpkgs": "nixpkgs_23" + "nixpkgs": "nixpkgs_24" }, "locked": { "lastModified": 1773955630, @@ -7391,7 +7391,7 @@ }, "logos-nix_230": { "inputs": { - "nixpkgs": "nixpkgs_231" + "nixpkgs": "nixpkgs_232" }, "locked": { "lastModified": 1774455309, @@ -7409,7 +7409,7 @@ }, "logos-nix_231": { "inputs": { - "nixpkgs": "nixpkgs_232" + "nixpkgs": "nixpkgs_233" }, "locked": { "lastModified": 1773955630, @@ -7427,7 +7427,7 @@ }, "logos-nix_232": { "inputs": { - "nixpkgs": "nixpkgs_233" + "nixpkgs": "nixpkgs_234" }, "locked": { "lastModified": 1773955630, @@ -7445,7 +7445,7 @@ }, "logos-nix_233": { "inputs": { - "nixpkgs": "nixpkgs_234" + "nixpkgs": "nixpkgs_235" }, "locked": { "lastModified": 1773955630, @@ -7463,7 +7463,7 @@ }, "logos-nix_234": { "inputs": { - "nixpkgs": "nixpkgs_235" + "nixpkgs": "nixpkgs_236" }, "locked": { "lastModified": 1773955630, @@ -7481,7 +7481,7 @@ }, "logos-nix_235": { "inputs": { - "nixpkgs": "nixpkgs_236" + "nixpkgs": "nixpkgs_237" }, "locked": { "lastModified": 1773955630, @@ -7499,7 +7499,7 @@ }, "logos-nix_236": { "inputs": { - "nixpkgs": "nixpkgs_237" + "nixpkgs": "nixpkgs_238" }, "locked": { "lastModified": 1774455309, @@ -7517,7 +7517,7 @@ }, "logos-nix_237": { "inputs": { - "nixpkgs": "nixpkgs_238" + "nixpkgs": "nixpkgs_239" }, "locked": { "lastModified": 1773955630, @@ -7535,7 +7535,7 @@ }, "logos-nix_238": { "inputs": { - "nixpkgs": "nixpkgs_239" + "nixpkgs": "nixpkgs_240" }, "locked": { "lastModified": 1774455309, @@ -7553,7 +7553,7 @@ }, "logos-nix_239": { "inputs": { - "nixpkgs": "nixpkgs_240" + "nixpkgs": "nixpkgs_241" }, "locked": { "lastModified": 1774455309, @@ -7571,7 +7571,7 @@ }, "logos-nix_24": { "inputs": { - "nixpkgs": "nixpkgs_24" + "nixpkgs": "nixpkgs_25" }, "locked": { "lastModified": 1774455309, @@ -7589,7 +7589,7 @@ }, "logos-nix_240": { "inputs": { - "nixpkgs": "nixpkgs_241" + "nixpkgs": "nixpkgs_242" }, "locked": { "lastModified": 1773955630, @@ -7607,7 +7607,7 @@ }, "logos-nix_241": { "inputs": { - "nixpkgs": "nixpkgs_242" + "nixpkgs": "nixpkgs_243" }, "locked": { "lastModified": 1773955630, @@ -7625,7 +7625,7 @@ }, "logos-nix_242": { "inputs": { - "nixpkgs": "nixpkgs_243" + "nixpkgs": "nixpkgs_244" }, "locked": { "lastModified": 1774455309, @@ -7643,7 +7643,7 @@ }, "logos-nix_243": { "inputs": { - "nixpkgs": "nixpkgs_244" + "nixpkgs": "nixpkgs_245" }, "locked": { "lastModified": 1774455309, @@ -7661,7 +7661,7 @@ }, "logos-nix_244": { "inputs": { - "nixpkgs": "nixpkgs_245" + "nixpkgs": "nixpkgs_246" }, "locked": { "lastModified": 1773955630, @@ -7679,7 +7679,7 @@ }, "logos-nix_245": { "inputs": { - "nixpkgs": "nixpkgs_246" + "nixpkgs": "nixpkgs_247" }, "locked": { "lastModified": 1773955630, @@ -7697,7 +7697,7 @@ }, "logos-nix_246": { "inputs": { - "nixpkgs": "nixpkgs_247" + "nixpkgs": "nixpkgs_248" }, "locked": { "lastModified": 1774455309, @@ -7715,7 +7715,7 @@ }, "logos-nix_247": { "inputs": { - "nixpkgs": "nixpkgs_248" + "nixpkgs": "nixpkgs_249" }, "locked": { "lastModified": 1774455309, @@ -7733,7 +7733,7 @@ }, "logos-nix_248": { "inputs": { - "nixpkgs": "nixpkgs_249" + "nixpkgs": "nixpkgs_250" }, "locked": { "lastModified": 1773955630, @@ -7751,7 +7751,7 @@ }, "logos-nix_249": { "inputs": { - "nixpkgs": "nixpkgs_250" + "nixpkgs": "nixpkgs_251" }, "locked": { "lastModified": 1773955630, @@ -7769,7 +7769,7 @@ }, "logos-nix_25": { "inputs": { - "nixpkgs": "nixpkgs_25" + "nixpkgs": "nixpkgs_26" }, "locked": { "lastModified": 1773955630, @@ -7787,7 +7787,7 @@ }, "logos-nix_250": { "inputs": { - "nixpkgs": "nixpkgs_251" + "nixpkgs": "nixpkgs_252" }, "locked": { "lastModified": 1773955630, @@ -7805,7 +7805,7 @@ }, "logos-nix_251": { "inputs": { - "nixpkgs": "nixpkgs_252" + "nixpkgs": "nixpkgs_253" }, "locked": { "lastModified": 1773955630, @@ -7823,7 +7823,7 @@ }, "logos-nix_252": { "inputs": { - "nixpkgs": "nixpkgs_253" + "nixpkgs": "nixpkgs_254" }, "locked": { "lastModified": 1774455309, @@ -7841,7 +7841,7 @@ }, "logos-nix_253": { "inputs": { - "nixpkgs": "nixpkgs_254" + "nixpkgs": "nixpkgs_255" }, "locked": { "lastModified": 1773955630, @@ -7859,7 +7859,7 @@ }, "logos-nix_254": { "inputs": { - "nixpkgs": "nixpkgs_255" + "nixpkgs": "nixpkgs_256" }, "locked": { "lastModified": 1773955630, @@ -7877,7 +7877,7 @@ }, "logos-nix_255": { "inputs": { - "nixpkgs": "nixpkgs_256" + "nixpkgs": "nixpkgs_257" }, "locked": { "lastModified": 1774455309, @@ -7895,7 +7895,7 @@ }, "logos-nix_256": { "inputs": { - "nixpkgs": "nixpkgs_257" + "nixpkgs": "nixpkgs_258" }, "locked": { "lastModified": 1774455309, @@ -7913,7 +7913,7 @@ }, "logos-nix_257": { "inputs": { - "nixpkgs": "nixpkgs_258" + "nixpkgs": "nixpkgs_259" }, "locked": { "lastModified": 1773955630, @@ -7931,7 +7931,7 @@ }, "logos-nix_258": { "inputs": { - "nixpkgs": "nixpkgs_259" + "nixpkgs": "nixpkgs_260" }, "locked": { "lastModified": 1774455309, @@ -7949,7 +7949,7 @@ }, "logos-nix_259": { "inputs": { - "nixpkgs": "nixpkgs_260" + "nixpkgs": "nixpkgs_261" }, "locked": { "lastModified": 1774455309, @@ -7967,7 +7967,7 @@ }, "logos-nix_26": { "inputs": { - "nixpkgs": "nixpkgs_26" + "nixpkgs": "nixpkgs_27" }, "locked": { "lastModified": 1774455309, @@ -7985,7 +7985,7 @@ }, "logos-nix_260": { "inputs": { - "nixpkgs": "nixpkgs_261" + "nixpkgs": "nixpkgs_262" }, "locked": { "lastModified": 1774455309, @@ -8003,7 +8003,7 @@ }, "logos-nix_261": { "inputs": { - "nixpkgs": "nixpkgs_262" + "nixpkgs": "nixpkgs_263" }, "locked": { "lastModified": 1774455309, @@ -8021,7 +8021,7 @@ }, "logos-nix_262": { "inputs": { - "nixpkgs": "nixpkgs_263" + "nixpkgs": "nixpkgs_264" }, "locked": { "lastModified": 1773955630, @@ -8039,7 +8039,7 @@ }, "logos-nix_263": { "inputs": { - "nixpkgs": "nixpkgs_264" + "nixpkgs": "nixpkgs_265" }, "locked": { "lastModified": 1773955630, @@ -8057,7 +8057,7 @@ }, "logos-nix_264": { "inputs": { - "nixpkgs": "nixpkgs_265" + "nixpkgs": "nixpkgs_266" }, "locked": { "lastModified": 1773955630, @@ -8075,7 +8075,7 @@ }, "logos-nix_265": { "inputs": { - "nixpkgs": "nixpkgs_266" + "nixpkgs": "nixpkgs_267" }, "locked": { "lastModified": 1773955630, @@ -8093,7 +8093,7 @@ }, "logos-nix_266": { "inputs": { - "nixpkgs": "nixpkgs_267" + "nixpkgs": "nixpkgs_268" }, "locked": { "lastModified": 1774455309, @@ -8111,7 +8111,7 @@ }, "logos-nix_267": { "inputs": { - "nixpkgs": "nixpkgs_268" + "nixpkgs": "nixpkgs_269" }, "locked": { "lastModified": 1774455309, @@ -8129,7 +8129,7 @@ }, "logos-nix_268": { "inputs": { - "nixpkgs": "nixpkgs_269" + "nixpkgs": "nixpkgs_270" }, "locked": { "lastModified": 1773955630, @@ -8147,7 +8147,7 @@ }, "logos-nix_269": { "inputs": { - "nixpkgs": "nixpkgs_271" + "nixpkgs": "nixpkgs_272" }, "locked": { "lastModified": 1774455309, @@ -8165,7 +8165,7 @@ }, "logos-nix_27": { "inputs": { - "nixpkgs": "nixpkgs_27" + "nixpkgs": "nixpkgs_28" }, "locked": { "lastModified": 1774455309, @@ -8183,7 +8183,7 @@ }, "logos-nix_270": { "inputs": { - "nixpkgs": "nixpkgs_272" + "nixpkgs": "nixpkgs_273" }, "locked": { "lastModified": 1773955630, @@ -8201,7 +8201,7 @@ }, "logos-nix_271": { "inputs": { - "nixpkgs": "nixpkgs_273" + "nixpkgs": "nixpkgs_274" }, "locked": { "lastModified": 1774455309, @@ -8219,7 +8219,7 @@ }, "logos-nix_272": { "inputs": { - "nixpkgs": "nixpkgs_274" + "nixpkgs": "nixpkgs_275" }, "locked": { "lastModified": 1773955630, @@ -8237,7 +8237,7 @@ }, "logos-nix_273": { "inputs": { - "nixpkgs": "nixpkgs_275" + "nixpkgs": "nixpkgs_276" }, "locked": { "lastModified": 1774455309, @@ -8255,7 +8255,7 @@ }, "logos-nix_274": { "inputs": { - "nixpkgs": "nixpkgs_276" + "nixpkgs": "nixpkgs_277" }, "locked": { "lastModified": 1773955630, @@ -8273,7 +8273,7 @@ }, "logos-nix_275": { "inputs": { - "nixpkgs": "nixpkgs_277" + "nixpkgs": "nixpkgs_278" }, "locked": { "lastModified": 1774455309, @@ -8291,7 +8291,7 @@ }, "logos-nix_276": { "inputs": { - "nixpkgs": "nixpkgs_278" + "nixpkgs": "nixpkgs_279" }, "locked": { "lastModified": 1774455309, @@ -8309,7 +8309,7 @@ }, "logos-nix_277": { "inputs": { - "nixpkgs": "nixpkgs_279" + "nixpkgs": "nixpkgs_280" }, "locked": { "lastModified": 1774455309, @@ -8327,7 +8327,7 @@ }, "logos-nix_278": { "inputs": { - "nixpkgs": "nixpkgs_280" + "nixpkgs": "nixpkgs_281" }, "locked": { "lastModified": 1774455309, @@ -8345,7 +8345,7 @@ }, "logos-nix_279": { "inputs": { - "nixpkgs": "nixpkgs_281" + "nixpkgs": "nixpkgs_282" }, "locked": { "lastModified": 1773955630, @@ -8363,7 +8363,7 @@ }, "logos-nix_28": { "inputs": { - "nixpkgs": "nixpkgs_28" + "nixpkgs": "nixpkgs_29" }, "locked": { "lastModified": 1773955630, @@ -8381,7 +8381,7 @@ }, "logos-nix_280": { "inputs": { - "nixpkgs": "nixpkgs_282" + "nixpkgs": "nixpkgs_283" }, "locked": { "lastModified": 1774455309, @@ -8399,7 +8399,7 @@ }, "logos-nix_281": { "inputs": { - "nixpkgs": "nixpkgs_283" + "nixpkgs": "nixpkgs_284" }, "locked": { "lastModified": 1773955630, @@ -8417,7 +8417,7 @@ }, "logos-nix_282": { "inputs": { - "nixpkgs": "nixpkgs_284" + "nixpkgs": "nixpkgs_285" }, "locked": { "lastModified": 1774455309, @@ -8435,7 +8435,7 @@ }, "logos-nix_283": { "inputs": { - "nixpkgs": "nixpkgs_285" + "nixpkgs": "nixpkgs_286" }, "locked": { "lastModified": 1773955630, @@ -8453,7 +8453,7 @@ }, "logos-nix_284": { "inputs": { - "nixpkgs": "nixpkgs_286" + "nixpkgs": "nixpkgs_287" }, "locked": { "lastModified": 1774455309, @@ -8471,7 +8471,7 @@ }, "logos-nix_285": { "inputs": { - "nixpkgs": "nixpkgs_287" + "nixpkgs": "nixpkgs_288" }, "locked": { "lastModified": 1773955630, @@ -8489,7 +8489,7 @@ }, "logos-nix_286": { "inputs": { - "nixpkgs": "nixpkgs_288" + "nixpkgs": "nixpkgs_289" }, "locked": { "lastModified": 1773955630, @@ -8507,7 +8507,7 @@ }, "logos-nix_287": { "inputs": { - "nixpkgs": "nixpkgs_289" + "nixpkgs": "nixpkgs_290" }, "locked": { "lastModified": 1774455309, @@ -8525,7 +8525,7 @@ }, "logos-nix_288": { "inputs": { - "nixpkgs": "nixpkgs_290" + "nixpkgs": "nixpkgs_291" }, "locked": { "lastModified": 1773955630, @@ -8543,7 +8543,7 @@ }, "logos-nix_289": { "inputs": { - "nixpkgs": "nixpkgs_291" + "nixpkgs": "nixpkgs_292" }, "locked": { "lastModified": 1773955630, @@ -8561,7 +8561,7 @@ }, "logos-nix_29": { "inputs": { - "nixpkgs": "nixpkgs_29" + "nixpkgs": "nixpkgs_30" }, "locked": { "lastModified": 1773955630, @@ -8579,7 +8579,7 @@ }, "logos-nix_290": { "inputs": { - "nixpkgs": "nixpkgs_292" + "nixpkgs": "nixpkgs_293" }, "locked": { "lastModified": 1773955630, @@ -8597,7 +8597,7 @@ }, "logos-nix_291": { "inputs": { - "nixpkgs": "nixpkgs_293" + "nixpkgs": "nixpkgs_294" }, "locked": { "lastModified": 1773955630, @@ -8615,7 +8615,7 @@ }, "logos-nix_292": { "inputs": { - "nixpkgs": "nixpkgs_294" + "nixpkgs": "nixpkgs_295" }, "locked": { "lastModified": 1774455309, @@ -8633,7 +8633,7 @@ }, "logos-nix_293": { "inputs": { - "nixpkgs": "nixpkgs_295" + "nixpkgs": "nixpkgs_296" }, "locked": { "lastModified": 1773955630, @@ -8651,7 +8651,7 @@ }, "logos-nix_294": { "inputs": { - "nixpkgs": "nixpkgs_296" + "nixpkgs": "nixpkgs_297" }, "locked": { "lastModified": 1774455309, @@ -8669,7 +8669,7 @@ }, "logos-nix_295": { "inputs": { - "nixpkgs": "nixpkgs_297" + "nixpkgs": "nixpkgs_298" }, "locked": { "lastModified": 1774455309, @@ -8687,7 +8687,7 @@ }, "logos-nix_296": { "inputs": { - "nixpkgs": "nixpkgs_298" + "nixpkgs": "nixpkgs_299" }, "locked": { "lastModified": 1773955630, @@ -8705,7 +8705,7 @@ }, "logos-nix_297": { "inputs": { - "nixpkgs": "nixpkgs_299" + "nixpkgs": "nixpkgs_300" }, "locked": { "lastModified": 1773955630, @@ -8723,7 +8723,7 @@ }, "logos-nix_298": { "inputs": { - "nixpkgs": "nixpkgs_300" + "nixpkgs": "nixpkgs_301" }, "locked": { "lastModified": 1773955630, @@ -8741,7 +8741,7 @@ }, "logos-nix_299": { "inputs": { - "nixpkgs": "nixpkgs_301" + "nixpkgs": "nixpkgs_302" }, "locked": { "lastModified": 1773955630, @@ -8759,7 +8759,7 @@ }, "logos-nix_3": { "inputs": { - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_4" }, "locked": { "lastModified": 1774455309, @@ -8777,7 +8777,7 @@ }, "logos-nix_30": { "inputs": { - "nixpkgs": "nixpkgs_30" + "nixpkgs": "nixpkgs_31" }, "locked": { "lastModified": 1773955630, @@ -8795,7 +8795,7 @@ }, "logos-nix_300": { "inputs": { - "nixpkgs": "nixpkgs_302" + "nixpkgs": "nixpkgs_303" }, "locked": { "lastModified": 1773955630, @@ -8813,7 +8813,7 @@ }, "logos-nix_301": { "inputs": { - "nixpkgs": "nixpkgs_303" + "nixpkgs": "nixpkgs_304" }, "locked": { "lastModified": 1774455309, @@ -8831,7 +8831,7 @@ }, "logos-nix_302": { "inputs": { - "nixpkgs": "nixpkgs_304" + "nixpkgs": "nixpkgs_305" }, "locked": { "lastModified": 1773955630, @@ -8849,7 +8849,7 @@ }, "logos-nix_303": { "inputs": { - "nixpkgs": "nixpkgs_305" + "nixpkgs": "nixpkgs_306" }, "locked": { "lastModified": 1774455309, @@ -8867,7 +8867,7 @@ }, "logos-nix_304": { "inputs": { - "nixpkgs": "nixpkgs_306" + "nixpkgs": "nixpkgs_307" }, "locked": { "lastModified": 1774455309, @@ -8885,7 +8885,7 @@ }, "logos-nix_305": { "inputs": { - "nixpkgs": "nixpkgs_307" + "nixpkgs": "nixpkgs_308" }, "locked": { "lastModified": 1773955630, @@ -8903,7 +8903,7 @@ }, "logos-nix_306": { "inputs": { - "nixpkgs": "nixpkgs_308" + "nixpkgs": "nixpkgs_309" }, "locked": { "lastModified": 1773955630, @@ -8921,7 +8921,7 @@ }, "logos-nix_307": { "inputs": { - "nixpkgs": "nixpkgs_309" + "nixpkgs": "nixpkgs_310" }, "locked": { "lastModified": 1774455309, @@ -8939,7 +8939,7 @@ }, "logos-nix_308": { "inputs": { - "nixpkgs": "nixpkgs_310" + "nixpkgs": "nixpkgs_311" }, "locked": { "lastModified": 1774455309, @@ -8957,7 +8957,7 @@ }, "logos-nix_309": { "inputs": { - "nixpkgs": "nixpkgs_311" + "nixpkgs": "nixpkgs_312" }, "locked": { "lastModified": 1773955630, @@ -8975,7 +8975,7 @@ }, "logos-nix_31": { "inputs": { - "nixpkgs": "nixpkgs_31" + "nixpkgs": "nixpkgs_32" }, "locked": { "lastModified": 1773955630, @@ -8993,7 +8993,7 @@ }, "logos-nix_310": { "inputs": { - "nixpkgs": "nixpkgs_312" + "nixpkgs": "nixpkgs_313" }, "locked": { "lastModified": 1773955630, @@ -9011,7 +9011,7 @@ }, "logos-nix_311": { "inputs": { - "nixpkgs": "nixpkgs_313" + "nixpkgs": "nixpkgs_314" }, "locked": { "lastModified": 1774455309, @@ -9029,7 +9029,7 @@ }, "logos-nix_312": { "inputs": { - "nixpkgs": "nixpkgs_314" + "nixpkgs": "nixpkgs_315" }, "locked": { "lastModified": 1774455309, @@ -9047,7 +9047,7 @@ }, "logos-nix_313": { "inputs": { - "nixpkgs": "nixpkgs_315" + "nixpkgs": "nixpkgs_316" }, "locked": { "lastModified": 1773955630, @@ -9065,7 +9065,7 @@ }, "logos-nix_314": { "inputs": { - "nixpkgs": "nixpkgs_316" + "nixpkgs": "nixpkgs_317" }, "locked": { "lastModified": 1773955630, @@ -9083,7 +9083,7 @@ }, "logos-nix_315": { "inputs": { - "nixpkgs": "nixpkgs_317" + "nixpkgs": "nixpkgs_318" }, "locked": { "lastModified": 1773955630, @@ -9101,7 +9101,7 @@ }, "logos-nix_316": { "inputs": { - "nixpkgs": "nixpkgs_318" + "nixpkgs": "nixpkgs_319" }, "locked": { "lastModified": 1773955630, @@ -9119,7 +9119,7 @@ }, "logos-nix_317": { "inputs": { - "nixpkgs": "nixpkgs_319" + "nixpkgs": "nixpkgs_320" }, "locked": { "lastModified": 1774455309, @@ -9137,7 +9137,7 @@ }, "logos-nix_318": { "inputs": { - "nixpkgs": "nixpkgs_320" + "nixpkgs": "nixpkgs_321" }, "locked": { "lastModified": 1773955630, @@ -9155,7 +9155,7 @@ }, "logos-nix_319": { "inputs": { - "nixpkgs": "nixpkgs_321" + "nixpkgs": "nixpkgs_322" }, "locked": { "lastModified": 1773955630, @@ -9173,7 +9173,7 @@ }, "logos-nix_32": { "inputs": { - "nixpkgs": "nixpkgs_32" + "nixpkgs": "nixpkgs_33" }, "locked": { "lastModified": 1773955630, @@ -9191,7 +9191,7 @@ }, "logos-nix_320": { "inputs": { - "nixpkgs": "nixpkgs_322" + "nixpkgs": "nixpkgs_323" }, "locked": { "lastModified": 1774455309, @@ -9209,7 +9209,7 @@ }, "logos-nix_321": { "inputs": { - "nixpkgs": "nixpkgs_323" + "nixpkgs": "nixpkgs_324" }, "locked": { "lastModified": 1773955630, @@ -9227,7 +9227,7 @@ }, "logos-nix_322": { "inputs": { - "nixpkgs": "nixpkgs_324" + "nixpkgs": "nixpkgs_325" }, "locked": { "lastModified": 1774455309, @@ -9245,7 +9245,7 @@ }, "logos-nix_323": { "inputs": { - "nixpkgs": "nixpkgs_325" + "nixpkgs": "nixpkgs_326" }, "locked": { "lastModified": 1773955630, @@ -9263,7 +9263,7 @@ }, "logos-nix_324": { "inputs": { - "nixpkgs": "nixpkgs_326" + "nixpkgs": "nixpkgs_327" }, "locked": { "lastModified": 1774455309, @@ -9281,7 +9281,7 @@ }, "logos-nix_325": { "inputs": { - "nixpkgs": "nixpkgs_327" + "nixpkgs": "nixpkgs_328" }, "locked": { "lastModified": 1773955630, @@ -9299,7 +9299,7 @@ }, "logos-nix_326": { "inputs": { - "nixpkgs": "nixpkgs_328" + "nixpkgs": "nixpkgs_329" }, "locked": { "lastModified": 1774455309, @@ -9317,7 +9317,7 @@ }, "logos-nix_327": { "inputs": { - "nixpkgs": "nixpkgs_329" + "nixpkgs": "nixpkgs_330" }, "locked": { "lastModified": 1773955630, @@ -9335,7 +9335,7 @@ }, "logos-nix_328": { "inputs": { - "nixpkgs": "nixpkgs_330" + "nixpkgs": "nixpkgs_331" }, "locked": { "lastModified": 1774455309, @@ -9353,7 +9353,7 @@ }, "logos-nix_329": { "inputs": { - "nixpkgs": "nixpkgs_331" + "nixpkgs": "nixpkgs_332" }, "locked": { "lastModified": 1773955630, @@ -9371,7 +9371,7 @@ }, "logos-nix_33": { "inputs": { - "nixpkgs": "nixpkgs_33" + "nixpkgs": "nixpkgs_34" }, "locked": { "lastModified": 1774455309, @@ -9389,7 +9389,7 @@ }, "logos-nix_330": { "inputs": { - "nixpkgs": "nixpkgs_332" + "nixpkgs": "nixpkgs_333" }, "locked": { "lastModified": 1773955630, @@ -9407,7 +9407,7 @@ }, "logos-nix_331": { "inputs": { - "nixpkgs": "nixpkgs_333" + "nixpkgs": "nixpkgs_334" }, "locked": { "lastModified": 1774455309, @@ -9425,7 +9425,7 @@ }, "logos-nix_332": { "inputs": { - "nixpkgs": "nixpkgs_334" + "nixpkgs": "nixpkgs_335" }, "locked": { "lastModified": 1773955630, @@ -9443,7 +9443,7 @@ }, "logos-nix_333": { "inputs": { - "nixpkgs": "nixpkgs_335" + "nixpkgs": "nixpkgs_336" }, "locked": { "lastModified": 1773955630, @@ -9461,7 +9461,7 @@ }, "logos-nix_334": { "inputs": { - "nixpkgs": "nixpkgs_336" + "nixpkgs": "nixpkgs_337" }, "locked": { "lastModified": 1773955630, @@ -9479,7 +9479,7 @@ }, "logos-nix_335": { "inputs": { - "nixpkgs": "nixpkgs_337" + "nixpkgs": "nixpkgs_338" }, "locked": { "lastModified": 1773955630, @@ -9497,7 +9497,7 @@ }, "logos-nix_336": { "inputs": { - "nixpkgs": "nixpkgs_338" + "nixpkgs": "nixpkgs_339" }, "locked": { "lastModified": 1774455309, @@ -9515,7 +9515,7 @@ }, "logos-nix_337": { "inputs": { - "nixpkgs": "nixpkgs_339" + "nixpkgs": "nixpkgs_340" }, "locked": { "lastModified": 1773955630, @@ -9533,7 +9533,7 @@ }, "logos-nix_338": { "inputs": { - "nixpkgs": "nixpkgs_340" + "nixpkgs": "nixpkgs_341" }, "locked": { "lastModified": 1774455309, @@ -9551,7 +9551,7 @@ }, "logos-nix_339": { "inputs": { - "nixpkgs": "nixpkgs_341" + "nixpkgs": "nixpkgs_342" }, "locked": { "lastModified": 1774455309, @@ -9569,7 +9569,7 @@ }, "logos-nix_34": { "inputs": { - "nixpkgs": "nixpkgs_34" + "nixpkgs": "nixpkgs_35" }, "locked": { "lastModified": 1773955630, @@ -9587,7 +9587,7 @@ }, "logos-nix_340": { "inputs": { - "nixpkgs": "nixpkgs_342" + "nixpkgs": "nixpkgs_343" }, "locked": { "lastModified": 1773955630, @@ -9605,7 +9605,7 @@ }, "logos-nix_341": { "inputs": { - "nixpkgs": "nixpkgs_343" + "nixpkgs": "nixpkgs_344" }, "locked": { "lastModified": 1773955630, @@ -9623,7 +9623,7 @@ }, "logos-nix_342": { "inputs": { - "nixpkgs": "nixpkgs_344" + "nixpkgs": "nixpkgs_345" }, "locked": { "lastModified": 1773955630, @@ -9641,7 +9641,7 @@ }, "logos-nix_343": { "inputs": { - "nixpkgs": "nixpkgs_345" + "nixpkgs": "nixpkgs_346" }, "locked": { "lastModified": 1773955630, @@ -9659,7 +9659,7 @@ }, "logos-nix_344": { "inputs": { - "nixpkgs": "nixpkgs_346" + "nixpkgs": "nixpkgs_347" }, "locked": { "lastModified": 1773955630, @@ -9677,7 +9677,7 @@ }, "logos-nix_345": { "inputs": { - "nixpkgs": "nixpkgs_347" + "nixpkgs": "nixpkgs_348" }, "locked": { "lastModified": 1774455309, @@ -9695,7 +9695,7 @@ }, "logos-nix_346": { "inputs": { - "nixpkgs": "nixpkgs_348" + "nixpkgs": "nixpkgs_349" }, "locked": { "lastModified": 1773955630, @@ -9713,7 +9713,7 @@ }, "logos-nix_347": { "inputs": { - "nixpkgs": "nixpkgs_349" + "nixpkgs": "nixpkgs_350" }, "locked": { "lastModified": 1774455309, @@ -9731,7 +9731,7 @@ }, "logos-nix_348": { "inputs": { - "nixpkgs": "nixpkgs_350" + "nixpkgs": "nixpkgs_351" }, "locked": { "lastModified": 1774455309, @@ -9749,7 +9749,7 @@ }, "logos-nix_349": { "inputs": { - "nixpkgs": "nixpkgs_351" + "nixpkgs": "nixpkgs_352" }, "locked": { "lastModified": 1773955630, @@ -9767,7 +9767,7 @@ }, "logos-nix_35": { "inputs": { - "nixpkgs": "nixpkgs_35" + "nixpkgs": "nixpkgs_36" }, "locked": { "lastModified": 1774455309, @@ -9785,7 +9785,7 @@ }, "logos-nix_350": { "inputs": { - "nixpkgs": "nixpkgs_352" + "nixpkgs": "nixpkgs_353" }, "locked": { "lastModified": 1773955630, @@ -9803,7 +9803,7 @@ }, "logos-nix_351": { "inputs": { - "nixpkgs": "nixpkgs_353" + "nixpkgs": "nixpkgs_354" }, "locked": { "lastModified": 1774455309, @@ -9821,7 +9821,7 @@ }, "logos-nix_352": { "inputs": { - "nixpkgs": "nixpkgs_354" + "nixpkgs": "nixpkgs_355" }, "locked": { "lastModified": 1774455309, @@ -9839,7 +9839,7 @@ }, "logos-nix_353": { "inputs": { - "nixpkgs": "nixpkgs_355" + "nixpkgs": "nixpkgs_356" }, "locked": { "lastModified": 1773955630, @@ -9857,7 +9857,7 @@ }, "logos-nix_354": { "inputs": { - "nixpkgs": "nixpkgs_356" + "nixpkgs": "nixpkgs_357" }, "locked": { "lastModified": 1773955630, @@ -9875,7 +9875,7 @@ }, "logos-nix_355": { "inputs": { - "nixpkgs": "nixpkgs_357" + "nixpkgs": "nixpkgs_358" }, "locked": { "lastModified": 1774455309, @@ -9893,7 +9893,7 @@ }, "logos-nix_356": { "inputs": { - "nixpkgs": "nixpkgs_358" + "nixpkgs": "nixpkgs_359" }, "locked": { "lastModified": 1774455309, @@ -9911,7 +9911,7 @@ }, "logos-nix_357": { "inputs": { - "nixpkgs": "nixpkgs_359" + "nixpkgs": "nixpkgs_360" }, "locked": { "lastModified": 1773955630, @@ -9929,7 +9929,7 @@ }, "logos-nix_358": { "inputs": { - "nixpkgs": "nixpkgs_360" + "nixpkgs": "nixpkgs_361" }, "locked": { "lastModified": 1773955630, @@ -9947,7 +9947,7 @@ }, "logos-nix_359": { "inputs": { - "nixpkgs": "nixpkgs_361" + "nixpkgs": "nixpkgs_362" }, "locked": { "lastModified": 1773955630, @@ -9965,7 +9965,7 @@ }, "logos-nix_36": { "inputs": { - "nixpkgs": "nixpkgs_36" + "nixpkgs": "nixpkgs_37" }, "locked": { "lastModified": 1774455309, @@ -9983,7 +9983,7 @@ }, "logos-nix_360": { "inputs": { - "nixpkgs": "nixpkgs_362" + "nixpkgs": "nixpkgs_363" }, "locked": { "lastModified": 1773955630, @@ -10001,7 +10001,7 @@ }, "logos-nix_361": { "inputs": { - "nixpkgs": "nixpkgs_363" + "nixpkgs": "nixpkgs_364" }, "locked": { "lastModified": 1774455309, @@ -10019,7 +10019,7 @@ }, "logos-nix_362": { "inputs": { - "nixpkgs": "nixpkgs_364" + "nixpkgs": "nixpkgs_365" }, "locked": { "lastModified": 1773955630, @@ -10037,7 +10037,7 @@ }, "logos-nix_363": { "inputs": { - "nixpkgs": "nixpkgs_365" + "nixpkgs": "nixpkgs_366" }, "locked": { "lastModified": 1773955630, @@ -10055,7 +10055,7 @@ }, "logos-nix_364": { "inputs": { - "nixpkgs": "nixpkgs_366" + "nixpkgs": "nixpkgs_367" }, "locked": { "lastModified": 1774455309, @@ -10073,7 +10073,7 @@ }, "logos-nix_365": { "inputs": { - "nixpkgs": "nixpkgs_367" + "nixpkgs": "nixpkgs_368" }, "locked": { "lastModified": 1773955630, @@ -10091,7 +10091,7 @@ }, "logos-nix_366": { "inputs": { - "nixpkgs": "nixpkgs_368" + "nixpkgs": "nixpkgs_369" }, "locked": { "lastModified": 1774455309, @@ -10109,7 +10109,7 @@ }, "logos-nix_367": { "inputs": { - "nixpkgs": "nixpkgs_369" + "nixpkgs": "nixpkgs_370" }, "locked": { "lastModified": 1774455309, @@ -10127,7 +10127,7 @@ }, "logos-nix_368": { "inputs": { - "nixpkgs": "nixpkgs_370" + "nixpkgs": "nixpkgs_371" }, "locked": { "lastModified": 1773955630, @@ -10145,7 +10145,7 @@ }, "logos-nix_369": { "inputs": { - "nixpkgs": "nixpkgs_371" + "nixpkgs": "nixpkgs_372" }, "locked": { "lastModified": 1773955630, @@ -10163,7 +10163,7 @@ }, "logos-nix_37": { "inputs": { - "nixpkgs": "nixpkgs_37" + "nixpkgs": "nixpkgs_38" }, "locked": { "lastModified": 1773955630, @@ -10181,7 +10181,7 @@ }, "logos-nix_370": { "inputs": { - "nixpkgs": "nixpkgs_372" + "nixpkgs": "nixpkgs_373" }, "locked": { "lastModified": 1773955630, @@ -10199,7 +10199,7 @@ }, "logos-nix_371": { "inputs": { - "nixpkgs": "nixpkgs_373" + "nixpkgs": "nixpkgs_374" }, "locked": { "lastModified": 1773955630, @@ -10217,7 +10217,7 @@ }, "logos-nix_372": { "inputs": { - "nixpkgs": "nixpkgs_374" + "nixpkgs": "nixpkgs_375" }, "locked": { "lastModified": 1774455309, @@ -10235,7 +10235,7 @@ }, "logos-nix_373": { "inputs": { - "nixpkgs": "nixpkgs_375" + "nixpkgs": "nixpkgs_376" }, "locked": { "lastModified": 1774455309, @@ -10253,7 +10253,7 @@ }, "logos-nix_374": { "inputs": { - "nixpkgs": "nixpkgs_376" + "nixpkgs": "nixpkgs_377" }, "locked": { "lastModified": 1773955630, @@ -10271,7 +10271,7 @@ }, "logos-nix_375": { "inputs": { - "nixpkgs": "nixpkgs_377" + "nixpkgs": "nixpkgs_378" }, "locked": { "lastModified": 1774455309, @@ -10289,7 +10289,7 @@ }, "logos-nix_376": { "inputs": { - "nixpkgs": "nixpkgs_378" + "nixpkgs": "nixpkgs_379" }, "locked": { "lastModified": 1773955630, @@ -10307,7 +10307,7 @@ }, "logos-nix_377": { "inputs": { - "nixpkgs": "nixpkgs_379" + "nixpkgs": "nixpkgs_380" }, "locked": { "lastModified": 1774455309, @@ -10325,7 +10325,7 @@ }, "logos-nix_378": { "inputs": { - "nixpkgs": "nixpkgs_380" + "nixpkgs": "nixpkgs_381" }, "locked": { "lastModified": 1774455309, @@ -10343,7 +10343,7 @@ }, "logos-nix_379": { "inputs": { - "nixpkgs": "nixpkgs_381" + "nixpkgs": "nixpkgs_382" }, "locked": { "lastModified": 1773955630, @@ -10361,7 +10361,7 @@ }, "logos-nix_38": { "inputs": { - "nixpkgs": "nixpkgs_38" + "nixpkgs": "nixpkgs_39" }, "locked": { "lastModified": 1773955630, @@ -10379,7 +10379,7 @@ }, "logos-nix_380": { "inputs": { - "nixpkgs": "nixpkgs_382" + "nixpkgs": "nixpkgs_383" }, "locked": { "lastModified": 1773955630, @@ -10397,7 +10397,7 @@ }, "logos-nix_381": { "inputs": { - "nixpkgs": "nixpkgs_383" + "nixpkgs": "nixpkgs_384" }, "locked": { "lastModified": 1774455309, @@ -10415,7 +10415,7 @@ }, "logos-nix_382": { "inputs": { - "nixpkgs": "nixpkgs_384" + "nixpkgs": "nixpkgs_385" }, "locked": { "lastModified": 1774455309, @@ -10433,7 +10433,7 @@ }, "logos-nix_383": { "inputs": { - "nixpkgs": "nixpkgs_385" + "nixpkgs": "nixpkgs_386" }, "locked": { "lastModified": 1773955630, @@ -10451,7 +10451,7 @@ }, "logos-nix_384": { "inputs": { - "nixpkgs": "nixpkgs_386" + "nixpkgs": "nixpkgs_387" }, "locked": { "lastModified": 1773955630, @@ -10469,7 +10469,7 @@ }, "logos-nix_385": { "inputs": { - "nixpkgs": "nixpkgs_387" + "nixpkgs": "nixpkgs_388" }, "locked": { "lastModified": 1774455309, @@ -10487,7 +10487,7 @@ }, "logos-nix_386": { "inputs": { - "nixpkgs": "nixpkgs_388" + "nixpkgs": "nixpkgs_389" }, "locked": { "lastModified": 1774455309, @@ -10505,7 +10505,7 @@ }, "logos-nix_387": { "inputs": { - "nixpkgs": "nixpkgs_389" + "nixpkgs": "nixpkgs_390" }, "locked": { "lastModified": 1773955630, @@ -10523,7 +10523,7 @@ }, "logos-nix_388": { "inputs": { - "nixpkgs": "nixpkgs_390" + "nixpkgs": "nixpkgs_391" }, "locked": { "lastModified": 1773955630, @@ -10541,7 +10541,7 @@ }, "logos-nix_389": { "inputs": { - "nixpkgs": "nixpkgs_391" + "nixpkgs": "nixpkgs_392" }, "locked": { "lastModified": 1773955630, @@ -10559,7 +10559,7 @@ }, "logos-nix_39": { "inputs": { - "nixpkgs": "nixpkgs_39" + "nixpkgs": "nixpkgs_40" }, "locked": { "lastModified": 1774455309, @@ -10577,7 +10577,7 @@ }, "logos-nix_390": { "inputs": { - "nixpkgs": "nixpkgs_392" + "nixpkgs": "nixpkgs_393" }, "locked": { "lastModified": 1773955630, @@ -10595,7 +10595,7 @@ }, "logos-nix_391": { "inputs": { - "nixpkgs": "nixpkgs_393" + "nixpkgs": "nixpkgs_394" }, "locked": { "lastModified": 1774455309, @@ -10613,7 +10613,7 @@ }, "logos-nix_392": { "inputs": { - "nixpkgs": "nixpkgs_394" + "nixpkgs": "nixpkgs_395" }, "locked": { "lastModified": 1773955630, @@ -10631,7 +10631,7 @@ }, "logos-nix_393": { "inputs": { - "nixpkgs": "nixpkgs_395" + "nixpkgs": "nixpkgs_396" }, "locked": { "lastModified": 1773955630, @@ -10649,7 +10649,7 @@ }, "logos-nix_394": { "inputs": { - "nixpkgs": "nixpkgs_396" + "nixpkgs": "nixpkgs_397" }, "locked": { "lastModified": 1774455309, @@ -10667,7 +10667,7 @@ }, "logos-nix_395": { "inputs": { - "nixpkgs": "nixpkgs_397" + "nixpkgs": "nixpkgs_398" }, "locked": { "lastModified": 1773955630, @@ -10685,7 +10685,7 @@ }, "logos-nix_396": { "inputs": { - "nixpkgs": "nixpkgs_398" + "nixpkgs": "nixpkgs_399" }, "locked": { "lastModified": 1773955630, @@ -10703,7 +10703,7 @@ }, "logos-nix_4": { "inputs": { - "nixpkgs": "nixpkgs_4" + "nixpkgs": "nixpkgs_5" }, "locked": { "lastModified": 1773955630, @@ -10721,7 +10721,7 @@ }, "logos-nix_40": { "inputs": { - "nixpkgs": "nixpkgs_40" + "nixpkgs": "nixpkgs_41" }, "locked": { "lastModified": 1774455309, @@ -10739,7 +10739,7 @@ }, "logos-nix_41": { "inputs": { - "nixpkgs": "nixpkgs_41" + "nixpkgs": "nixpkgs_42" }, "locked": { "lastModified": 1773955630, @@ -10757,7 +10757,7 @@ }, "logos-nix_42": { "inputs": { - "nixpkgs": "nixpkgs_42" + "nixpkgs": "nixpkgs_43" }, "locked": { "lastModified": 1773955630, @@ -10775,7 +10775,7 @@ }, "logos-nix_43": { "inputs": { - "nixpkgs": "nixpkgs_43" + "nixpkgs": "nixpkgs_44" }, "locked": { "lastModified": 1774455309, @@ -10793,7 +10793,7 @@ }, "logos-nix_44": { "inputs": { - "nixpkgs": "nixpkgs_44" + "nixpkgs": "nixpkgs_45" }, "locked": { "lastModified": 1774455309, @@ -10811,7 +10811,7 @@ }, "logos-nix_45": { "inputs": { - "nixpkgs": "nixpkgs_45" + "nixpkgs": "nixpkgs_46" }, "locked": { "lastModified": 1773955630, @@ -10829,7 +10829,7 @@ }, "logos-nix_46": { "inputs": { - "nixpkgs": "nixpkgs_46" + "nixpkgs": "nixpkgs_47" }, "locked": { "lastModified": 1773955630, @@ -10847,7 +10847,7 @@ }, "logos-nix_47": { "inputs": { - "nixpkgs": "nixpkgs_47" + "nixpkgs": "nixpkgs_48" }, "locked": { "lastModified": 1773955630, @@ -10865,7 +10865,7 @@ }, "logos-nix_48": { "inputs": { - "nixpkgs": "nixpkgs_48" + "nixpkgs": "nixpkgs_49" }, "locked": { "lastModified": 1773955630, @@ -10883,7 +10883,7 @@ }, "logos-nix_49": { "inputs": { - "nixpkgs": "nixpkgs_49" + "nixpkgs": "nixpkgs_50" }, "locked": { "lastModified": 1774455309, @@ -10901,7 +10901,7 @@ }, "logos-nix_5": { "inputs": { - "nixpkgs": "nixpkgs_5" + "nixpkgs": "nixpkgs_6" }, "locked": { "lastModified": 1774455309, @@ -10919,7 +10919,7 @@ }, "logos-nix_50": { "inputs": { - "nixpkgs": "nixpkgs_50" + "nixpkgs": "nixpkgs_51" }, "locked": { "lastModified": 1773955630, @@ -10937,7 +10937,7 @@ }, "logos-nix_51": { "inputs": { - "nixpkgs": "nixpkgs_51" + "nixpkgs": "nixpkgs_52" }, "locked": { "lastModified": 1773955630, @@ -10955,7 +10955,7 @@ }, "logos-nix_52": { "inputs": { - "nixpkgs": "nixpkgs_52" + "nixpkgs": "nixpkgs_53" }, "locked": { "lastModified": 1774455309, @@ -10973,7 +10973,7 @@ }, "logos-nix_53": { "inputs": { - "nixpkgs": "nixpkgs_53" + "nixpkgs": "nixpkgs_54" }, "locked": { "lastModified": 1773955630, @@ -10991,7 +10991,7 @@ }, "logos-nix_54": { "inputs": { - "nixpkgs": "nixpkgs_54" + "nixpkgs": "nixpkgs_55" }, "locked": { "lastModified": 1774455309, @@ -11009,7 +11009,7 @@ }, "logos-nix_55": { "inputs": { - "nixpkgs": "nixpkgs_55" + "nixpkgs": "nixpkgs_56" }, "locked": { "lastModified": 1773955630, @@ -11027,7 +11027,7 @@ }, "logos-nix_56": { "inputs": { - "nixpkgs": "nixpkgs_56" + "nixpkgs": "nixpkgs_57" }, "locked": { "lastModified": 1774455309, @@ -11045,7 +11045,7 @@ }, "logos-nix_57": { "inputs": { - "nixpkgs": "nixpkgs_57" + "nixpkgs": "nixpkgs_58" }, "locked": { "lastModified": 1773955630, @@ -11063,7 +11063,7 @@ }, "logos-nix_58": { "inputs": { - "nixpkgs": "nixpkgs_58" + "nixpkgs": "nixpkgs_59" }, "locked": { "lastModified": 1774455309, @@ -11081,7 +11081,7 @@ }, "logos-nix_59": { "inputs": { - "nixpkgs": "nixpkgs_59" + "nixpkgs": "nixpkgs_60" }, "locked": { "lastModified": 1773955630, @@ -11099,7 +11099,7 @@ }, "logos-nix_6": { "inputs": { - "nixpkgs": "nixpkgs_6" + "nixpkgs": "nixpkgs_7" }, "locked": { "lastModified": 1773955630, @@ -11117,7 +11117,7 @@ }, "logos-nix_60": { "inputs": { - "nixpkgs": "nixpkgs_60" + "nixpkgs": "nixpkgs_61" }, "locked": { "lastModified": 1774455309, @@ -11135,7 +11135,7 @@ }, "logos-nix_61": { "inputs": { - "nixpkgs": "nixpkgs_61" + "nixpkgs": "nixpkgs_62" }, "locked": { "lastModified": 1773955630, @@ -11153,7 +11153,7 @@ }, "logos-nix_62": { "inputs": { - "nixpkgs": "nixpkgs_62" + "nixpkgs": "nixpkgs_63" }, "locked": { "lastModified": 1773955630, @@ -11171,7 +11171,7 @@ }, "logos-nix_63": { "inputs": { - "nixpkgs": "nixpkgs_63" + "nixpkgs": "nixpkgs_64" }, "locked": { "lastModified": 1774455309, @@ -11189,7 +11189,7 @@ }, "logos-nix_64": { "inputs": { - "nixpkgs": "nixpkgs_64" + "nixpkgs": "nixpkgs_65" }, "locked": { "lastModified": 1773955630, @@ -11207,7 +11207,7 @@ }, "logos-nix_65": { "inputs": { - "nixpkgs": "nixpkgs_65" + "nixpkgs": "nixpkgs_66" }, "locked": { "lastModified": 1773955630, @@ -11225,7 +11225,7 @@ }, "logos-nix_66": { "inputs": { - "nixpkgs": "nixpkgs_66" + "nixpkgs": "nixpkgs_67" }, "locked": { "lastModified": 1773955630, @@ -11243,7 +11243,7 @@ }, "logos-nix_67": { "inputs": { - "nixpkgs": "nixpkgs_67" + "nixpkgs": "nixpkgs_68" }, "locked": { "lastModified": 1773955630, @@ -11261,7 +11261,7 @@ }, "logos-nix_68": { "inputs": { - "nixpkgs": "nixpkgs_68" + "nixpkgs": "nixpkgs_69" }, "locked": { "lastModified": 1774455309, @@ -11279,7 +11279,7 @@ }, "logos-nix_69": { "inputs": { - "nixpkgs": "nixpkgs_69" + "nixpkgs": "nixpkgs_70" }, "locked": { "lastModified": 1773955630, @@ -11297,7 +11297,7 @@ }, "logos-nix_7": { "inputs": { - "nixpkgs": "nixpkgs_7" + "nixpkgs": "nixpkgs_8" }, "locked": { "lastModified": 1774455309, @@ -11315,7 +11315,7 @@ }, "logos-nix_70": { "inputs": { - "nixpkgs": "nixpkgs_70" + "nixpkgs": "nixpkgs_71" }, "locked": { "lastModified": 1774455309, @@ -11333,7 +11333,7 @@ }, "logos-nix_71": { "inputs": { - "nixpkgs": "nixpkgs_71" + "nixpkgs": "nixpkgs_72" }, "locked": { "lastModified": 1774455309, @@ -11351,7 +11351,7 @@ }, "logos-nix_72": { "inputs": { - "nixpkgs": "nixpkgs_72" + "nixpkgs": "nixpkgs_73" }, "locked": { "lastModified": 1773955630, @@ -11369,7 +11369,7 @@ }, "logos-nix_73": { "inputs": { - "nixpkgs": "nixpkgs_73" + "nixpkgs": "nixpkgs_74" }, "locked": { "lastModified": 1773955630, @@ -11387,7 +11387,7 @@ }, "logos-nix_74": { "inputs": { - "nixpkgs": "nixpkgs_74" + "nixpkgs": "nixpkgs_75" }, "locked": { "lastModified": 1773955630, @@ -11405,7 +11405,7 @@ }, "logos-nix_75": { "inputs": { - "nixpkgs": "nixpkgs_75" + "nixpkgs": "nixpkgs_76" }, "locked": { "lastModified": 1773955630, @@ -11423,7 +11423,7 @@ }, "logos-nix_76": { "inputs": { - "nixpkgs": "nixpkgs_76" + "nixpkgs": "nixpkgs_77" }, "locked": { "lastModified": 1773955630, @@ -11441,7 +11441,7 @@ }, "logos-nix_77": { "inputs": { - "nixpkgs": "nixpkgs_77" + "nixpkgs": "nixpkgs_78" }, "locked": { "lastModified": 1774455309, @@ -11459,7 +11459,7 @@ }, "logos-nix_78": { "inputs": { - "nixpkgs": "nixpkgs_78" + "nixpkgs": "nixpkgs_79" }, "locked": { "lastModified": 1773955630, @@ -11477,7 +11477,7 @@ }, "logos-nix_79": { "inputs": { - "nixpkgs": "nixpkgs_79" + "nixpkgs": "nixpkgs_80" }, "locked": { "lastModified": 1774455309, @@ -11495,7 +11495,7 @@ }, "logos-nix_8": { "inputs": { - "nixpkgs": "nixpkgs_8" + "nixpkgs": "nixpkgs_9" }, "locked": { "lastModified": 1774455309, @@ -11513,7 +11513,7 @@ }, "logos-nix_80": { "inputs": { - "nixpkgs": "nixpkgs_80" + "nixpkgs": "nixpkgs_81" }, "locked": { "lastModified": 1774455309, @@ -11531,7 +11531,7 @@ }, "logos-nix_81": { "inputs": { - "nixpkgs": "nixpkgs_81" + "nixpkgs": "nixpkgs_82" }, "locked": { "lastModified": 1773955630, @@ -11549,7 +11549,7 @@ }, "logos-nix_82": { "inputs": { - "nixpkgs": "nixpkgs_82" + "nixpkgs": "nixpkgs_83" }, "locked": { "lastModified": 1773955630, @@ -11567,7 +11567,7 @@ }, "logos-nix_83": { "inputs": { - "nixpkgs": "nixpkgs_83" + "nixpkgs": "nixpkgs_84" }, "locked": { "lastModified": 1774455309, @@ -11585,7 +11585,7 @@ }, "logos-nix_84": { "inputs": { - "nixpkgs": "nixpkgs_84" + "nixpkgs": "nixpkgs_85" }, "locked": { "lastModified": 1774455309, @@ -11603,7 +11603,7 @@ }, "logos-nix_85": { "inputs": { - "nixpkgs": "nixpkgs_85" + "nixpkgs": "nixpkgs_86" }, "locked": { "lastModified": 1773955630, @@ -11621,7 +11621,7 @@ }, "logos-nix_86": { "inputs": { - "nixpkgs": "nixpkgs_86" + "nixpkgs": "nixpkgs_87" }, "locked": { "lastModified": 1773955630, @@ -11639,7 +11639,7 @@ }, "logos-nix_87": { "inputs": { - "nixpkgs": "nixpkgs_87" + "nixpkgs": "nixpkgs_88" }, "locked": { "lastModified": 1774455309, @@ -11657,7 +11657,7 @@ }, "logos-nix_88": { "inputs": { - "nixpkgs": "nixpkgs_88" + "nixpkgs": "nixpkgs_89" }, "locked": { "lastModified": 1774455309, @@ -11675,7 +11675,7 @@ }, "logos-nix_89": { "inputs": { - "nixpkgs": "nixpkgs_89" + "nixpkgs": "nixpkgs_90" }, "locked": { "lastModified": 1773955630, @@ -11693,7 +11693,7 @@ }, "logos-nix_9": { "inputs": { - "nixpkgs": "nixpkgs_9" + "nixpkgs": "nixpkgs_10" }, "locked": { "lastModified": 1774455309, @@ -11711,7 +11711,7 @@ }, "logos-nix_90": { "inputs": { - "nixpkgs": "nixpkgs_90" + "nixpkgs": "nixpkgs_91" }, "locked": { "lastModified": 1773955630, @@ -11729,7 +11729,7 @@ }, "logos-nix_91": { "inputs": { - "nixpkgs": "nixpkgs_91" + "nixpkgs": "nixpkgs_92" }, "locked": { "lastModified": 1773955630, @@ -11747,7 +11747,7 @@ }, "logos-nix_92": { "inputs": { - "nixpkgs": "nixpkgs_92" + "nixpkgs": "nixpkgs_93" }, "locked": { "lastModified": 1773955630, @@ -11765,7 +11765,7 @@ }, "logos-nix_93": { "inputs": { - "nixpkgs": "nixpkgs_93" + "nixpkgs": "nixpkgs_94" }, "locked": { "lastModified": 1774455309, @@ -11783,7 +11783,7 @@ }, "logos-nix_94": { "inputs": { - "nixpkgs": "nixpkgs_94" + "nixpkgs": "nixpkgs_95" }, "locked": { "lastModified": 1773955630, @@ -11801,7 +11801,7 @@ }, "logos-nix_95": { "inputs": { - "nixpkgs": "nixpkgs_95" + "nixpkgs": "nixpkgs_96" }, "locked": { "lastModified": 1773955630, @@ -11819,7 +11819,7 @@ }, "logos-nix_96": { "inputs": { - "nixpkgs": "nixpkgs_96" + "nixpkgs": "nixpkgs_97" }, "locked": { "lastModified": 1774455309, @@ -11837,7 +11837,7 @@ }, "logos-nix_97": { "inputs": { - "nixpkgs": "nixpkgs_97" + "nixpkgs": "nixpkgs_98" }, "locked": { "lastModified": 1773955630, @@ -11855,7 +11855,7 @@ }, "logos-nix_98": { "inputs": { - "nixpkgs": "nixpkgs_98" + "nixpkgs": "nixpkgs_99" }, "locked": { "lastModified": 1774455309, @@ -11873,7 +11873,7 @@ }, "logos-nix_99": { "inputs": { - "nixpkgs": "nixpkgs_99" + "nixpkgs": "nixpkgs_100" }, "locked": { "lastModified": 1774455309, @@ -14438,11 +14438,11 @@ ] }, "locked": { - "lastModified": 1782082589, - "narHash": "sha256-Qeqxp0HYb3oTpmfD5YlFPJzpAJa7Ilb9o4sMeVvmHRI=", + "lastModified": 1782920676, + "narHash": "sha256-Vb81kiYbi8yYDZbUSW6v7QhV6uO/pj7F+lCAW1coAsY=", "owner": "logos-co", "repo": "logos-protocol", - "rev": "315a3a2e0af61bc47aad5601ee44cd7689975820", + "rev": "d7ad26d369c4e464a99f2a357f10c5947c7174e1", "type": "github" }, "original": { @@ -16410,17 +16410,17 @@ "nix-bundle-lgx": "nix-bundle-lgx_28" }, "locked": { - "lastModified": 1782313954, - "narHash": "sha256-psh5EtcIZh6kzFD4pQDT8bae9JS9eVtk5nPWxR2aGSA=", + "lastModified": 1782741385, + "narHash": "sha256-kN6xb1b/Jvu9Ninaqtmi/C4fx8poisGYbThIBIXwvHw=", "owner": "logos-blockchain", "repo": "logos-execution-zone-module", - "rev": "d2e9400ac06c3cdbfc2405b4f153fff9841a453c", + "rev": "d70225ced646934d2294fd9e8f8b03615c104b80", "type": "github" }, "original": { "owner": "logos-blockchain", "repo": "logos-execution-zone-module", - "rev": "d2e9400ac06c3cdbfc2405b4f153fff9841a453c", + "rev": "d70225ced646934d2294fd9e8f8b03615c104b80", "type": "github" } }, @@ -20096,22 +20096,6 @@ "type": "github" } }, - "nixpkgs": { - "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_10": { "locked": { "lastModified": 1759036355, @@ -20545,22 +20529,6 @@ } }, "nixpkgs_124": { - "locked": { - "lastModified": 1767313136, - "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-25.05", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_125": { "locked": { "lastModified": 1759036355, "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", @@ -20576,6 +20544,22 @@ "type": "github" } }, + "nixpkgs_125": { + "locked": { + "lastModified": 1767313136, + "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_126": { "locked": { "lastModified": 1759036355, @@ -23137,22 +23121,6 @@ } }, "nixpkgs_270": { - "locked": { - "lastModified": 1767313136, - "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-25.05", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_271": { "locked": { "lastModified": 1759036355, "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", @@ -23168,6 +23136,22 @@ "type": "github" } }, + "nixpkgs_271": { + "locked": { + "lastModified": 1767313136, + "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_272": { "locked": { "lastModified": 1759036355, @@ -25408,6 +25392,22 @@ "type": "github" } }, + "nixpkgs_399": { + "locked": { + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_4": { "locked": { "lastModified": 1759036355, @@ -26763,9 +26763,22 @@ "root": { "inputs": { "logos-module-builder": "logos-module-builder", - "logos_execution_zone": "logos_execution_zone" + "logos_execution_zone": "logos_execution_zone", + "shared_wallet": "shared_wallet" } }, + "shared_wallet": { + "flake": false, + "locked": { + "path": "../shared/wallet", + "type": "path" + }, + "original": { + "path": "../shared/wallet", + "type": "path" + }, + "parent": [] + }, "rust-overlay": { "inputs": { "nixpkgs": [ @@ -26833,7 +26846,7 @@ }, "rust-rapidsnark": { "inputs": { - "nixpkgs": "nixpkgs_270" + "nixpkgs": "nixpkgs_271" }, "locked": { "lastModified": 1781090841, diff --git a/apps/amm/flake.nix b/apps/amm/flake.nix index 0811f1b..7f345e1 100644 --- a/apps/amm/flake.nix +++ b/apps/amm/flake.nix @@ -4,17 +4,41 @@ inputs = { logos-module-builder.url = "github:logos-co/logos-module-builder"; + # Shared C++ wallet access and Logos.Wallet QML sources. + shared_wallet = { + url = "path:../shared/wallet"; + flake = false; + }; + # Core wallet module (the LEZ wallet FFI Qt plugin). The input name must # match the metadata.json `dependencies` entry so the builder can resolve - # it as a module dependency. This rev pins LEZ (lssa) at fb8cbac4, which - # includes the macOS Metal-build fix, so no `--override-input` is needed. - logos_execution_zone.url = "github:logos-blockchain/logos-execution-zone-module?rev=d2e9400ac06c3cdbfc2405b4f153fff9841a453c"; + # it as a module dependency. This revision exposes generic transaction + # submission by deployed program ID. + logos_execution_zone.url = "github:logos-blockchain/logos-execution-zone-module?rev=d70225ced646934d2294fd9e8f8b03615c104b80"; }; - outputs = inputs@{ logos-module-builder, ... }: + outputs = inputs@{ logos-module-builder, shared_wallet, ... }: logos-module-builder.lib.mkLogosQmlModule { src = ./.; configFile = ./metadata.json; flakeInputs = inputs; + preConfigure = '' + cmakeFlagsArray+=("-DLOGOS_WALLET_SOURCE_DIR=${shared_wallet}") + ''; + postInstall = '' + # The builder installs the view under lib/qml after this hook. Its + # import descriptor points back to this compiled shared QML module. + test -f ${./qml}/Logos/Wallet/qmldir + + walletQmlDir="shared-wallet/qml/Logos/Wallet" + if [ ! -d "$walletQmlDir" ]; then + echo "Built Logos.Wallet QML module not found" + exit 1 + fi + walletQmlInstallDir="$out/lib/Logos/Wallet" + mkdir -p "$walletQmlInstallDir" + cp -r "$walletQmlDir/." "$walletQmlInstallDir/" + test -f "$walletQmlInstallDir/qmldir" + ''; }; } diff --git a/apps/amm/qml/Logos/Wallet/qmldir b/apps/amm/qml/Logos/Wallet/qmldir new file mode 100644 index 0000000..866351b --- /dev/null +++ b/apps/amm/qml/Logos/Wallet/qmldir @@ -0,0 +1,5 @@ +module Logos.Wallet +optional plugin logos_wallet_qmlplugin ../../../Logos/Wallet +classname Logos_WalletPlugin +prefer :/qt/qml/Logos/Wallet/ +depends QtQuick diff --git a/apps/amm/qml/NavBar.qml b/apps/amm/qml/NavBar.qml index f5b7857..3c06f91 100644 --- a/apps/amm/qml/NavBar.qml +++ b/apps/amm/qml/NavBar.qml @@ -2,8 +2,7 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 import Logos.Theme - -import "components/wallet" +import Logos.Wallet // Self-contained navigation bar — styling is independent of any view's theme. // Use currentIndex to read the active tab; tabChanged(index) fires on selection. @@ -94,11 +93,15 @@ Item { } // Wallet / account control on the far right. - AccountControl { + WalletControl { id: accountControl Layout.leftMargin: 12 - backend: root.backend + wallet: root.backend accountModel: root.accountModel + viewportWidth: root.width + watchCall: function(result, success, failure) { + logos.watch(result, success, failure) + } } } } diff --git a/apps/amm/qml/components/liquidity/LiquidityConfirmationDialog.qml b/apps/amm/qml/components/liquidity/LiquidityConfirmationDialog.qml deleted file mode 100644 index 16b0dc6..0000000 --- a/apps/amm/qml/components/liquidity/LiquidityConfirmationDialog.qml +++ /dev/null @@ -1,238 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 - -FocusScope { - id: root - - property var snapshot: ({}) - property bool open: false - readonly property bool isAdd: root.snapshot.action === "add" - - signal canceled - signal confirmed(var snapshot) - - visible: root.open - z: 20 - - Keys.onEscapePressed: root.cancel() - - function openWithSnapshot(nextSnapshot) { - root.snapshot = nextSnapshot; - root.open = true; - root.forceActiveFocus(); - cancelButton.forceActiveFocus(); - } - - function cancel() { - root.open = false; - root.canceled(); - } - - function confirm() { - const confirmedSnapshot = root.snapshot; - root.open = false; - root.confirmed(confirmedSnapshot); - } - - Rectangle { - anchors.fill: parent - color: "#99000000" - - MouseArea { - anchors.fill: parent - } - } - - Rectangle { - id: panel - - anchors.centerIn: parent - color: "#1D1D1D" - implicitHeight: dialogContent.implicitHeight + 24 - radius: 8 - width: Math.max(0, Math.min(360, root.width - 32)) - border.color: "#343434" - border.width: 1 - - ColumnLayout { - id: dialogContent - - anchors.fill: parent - anchors.margins: 12 - spacing: 12 - - Text { - color: "#E7E1D8" - font.bold: true - font.pixelSize: 16 - text: root.isAdd ? qsTr("Confirm add liquidity") : qsTr("Confirm remove liquidity") - - Layout.fillWidth: true - } - - ColumnLayout { - spacing: 8 - visible: root.isAdd - - Layout.fillWidth: true - - SummaryRow { - label: qsTr("Deposit %1").arg(root.snapshot.tokenA || "") - value: root.snapshot.depositA || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Deposit %1").arg(root.snapshot.tokenB || "") - value: root.snapshot.depositB || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Receive at least") - value: root.snapshot.minLpReceived || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Current ratio") - value: root.snapshot.currentRatio || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Fee tier") - value: root.snapshot.feeTier || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Slippage tolerance") - value: root.snapshot.slippageTolerance || "" - - Layout.fillWidth: true - } - } - - ColumnLayout { - spacing: 8 - visible: !root.isAdd - - Layout.fillWidth: true - - SummaryRow { - label: qsTr("Burn LP") - value: qsTr("%1 (%2)").arg(root.snapshot.burnText || "").arg(root.snapshot.burnPercent || "") - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Receive at least %1").arg(root.snapshot.tokenA || "") - value: root.snapshot.minTokenAReceived || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Receive at least %1").arg(root.snapshot.tokenB || "") - value: root.snapshot.minTokenBReceived || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Slippage tolerance") - value: root.snapshot.slippageTolerance || "" - - Layout.fillWidth: true - } - - SummaryRow { - label: qsTr("Post-removal share") - value: root.snapshot.postRemovalShare || "" - - Layout.fillWidth: true - } - } - - RowLayout { - spacing: 8 - - Layout.fillWidth: true - - Button { - id: cancelButton - - activeFocusOnTab: true - focusPolicy: Qt.StrongFocus - hoverEnabled: true - text: qsTr("Cancel") - - Accessible.name: cancelButton.text - - Layout.fillWidth: true - Layout.minimumHeight: 44 - - onClicked: root.cancel() - - contentItem: Text { - color: cancelButton.hovered || cancelButton.activeFocus ? "#151515" : "#E7E1D8" - elide: Text.ElideRight - font.bold: true - font.pixelSize: 13 - horizontalAlignment: Text.AlignHCenter - text: cancelButton.text - verticalAlignment: Text.AlignVCenter - } - - background: Rectangle { - border.color: cancelButton.activeFocus ? "#F26A21" : "#343434" - border.width: 1 - color: cancelButton.pressed ? "#343434" : cancelButton.hovered || cancelButton.activeFocus ? "#E7E1D8" : "#151515" - radius: 6 - } - } - - Button { - id: confirmButton - - activeFocusOnTab: true - focusPolicy: Qt.StrongFocus - hoverEnabled: true - text: qsTr("Confirm") - - Accessible.name: confirmButton.text - - Layout.fillWidth: true - Layout.minimumHeight: 44 - - onClicked: root.confirm() - - contentItem: Text { - color: "#151515" - elide: Text.ElideRight - font.bold: true - font.pixelSize: 13 - horizontalAlignment: Text.AlignHCenter - text: confirmButton.text - verticalAlignment: Text.AlignVCenter - } - - background: Rectangle { - border.color: "#F26A21" - border.width: 1 - color: confirmButton.pressed ? "#D95C1E" : confirmButton.hovered || confirmButton.activeFocus ? "#FF8A3D" : "#F26A21" - radius: 6 - } - } - } - } - } -} diff --git a/apps/amm/qml/components/liquidity/LiquidityConfirmationSummary.qml b/apps/amm/qml/components/liquidity/LiquidityConfirmationSummary.qml new file mode 100644 index 0000000..68af40d --- /dev/null +++ b/apps/amm/qml/components/liquidity/LiquidityConfirmationSummary.qml @@ -0,0 +1,91 @@ +import QtQuick +import QtQuick.Layouts + +ColumnLayout { + id: root + + property var snapshot: ({}) + readonly property bool isAdd: root.snapshot.action === "add" + + spacing: 8 + + ColumnLayout { + Layout.fillWidth: true + spacing: 8 + visible: root.isAdd + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Deposit %1").arg(root.snapshot.tokenA || "") + value: root.snapshot.depositA || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Deposit %1").arg(root.snapshot.tokenB || "") + value: root.snapshot.depositB || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Receive at least") + value: root.snapshot.minLpReceived || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Current ratio") + value: root.snapshot.currentRatio || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Fee tier") + value: root.snapshot.feeTier || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Slippage tolerance") + value: root.snapshot.slippageTolerance || "" + } + } + + ColumnLayout { + Layout.fillWidth: true + spacing: 8 + visible: !root.isAdd + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Burn LP") + value: qsTr("%1 (%2)") + .arg(root.snapshot.burnText || "") + .arg(root.snapshot.burnPercent || "") + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Receive at least %1").arg(root.snapshot.tokenA || "") + value: root.snapshot.minTokenAReceived || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Receive at least %1").arg(root.snapshot.tokenB || "") + value: root.snapshot.minTokenBReceived || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Slippage tolerance") + value: root.snapshot.slippageTolerance || "" + } + + SummaryRow { + Layout.fillWidth: true + label: qsTr("Post-removal share") + value: root.snapshot.postRemovalShare || "" + } + } +} diff --git a/apps/amm/qml/components/swap/SwapConfirmationDialog.qml b/apps/amm/qml/components/swap/SwapConfirmationDialog.qml deleted file mode 100644 index 54f61b4..0000000 --- a/apps/amm/qml/components/swap/SwapConfirmationDialog.qml +++ /dev/null @@ -1,225 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 -import QtQuick.Layouts 1.15 - -FocusScope { - id: root - - property var theme - property var snapshot: ({}) - property bool open: false - - signal canceled - signal confirmed(var snapshot) - - visible: root.open - z: 20 - - Keys.onEscapePressed: root.cancel() - - function openWithSnapshot(nextSnapshot) { - root.snapshot = nextSnapshot; - root.open = true; - root.forceActiveFocus(); - cancelButton.forceActiveFocus(); - } - - function cancel() { - root.open = false; - root.canceled(); - } - - function confirm() { - const confirmedSnapshot = root.snapshot; - root.open = false; - root.confirmed(confirmedSnapshot); - } - - Rectangle { - anchors.fill: parent - color: "#99000000" - - MouseArea { - anchors.fill: parent - } - } - - Rectangle { - id: panel - - anchors.centerIn: parent - color: root.theme.colors.cardBg - implicitHeight: dialogContent.implicitHeight + 32 - radius: 16 - width: Math.max(0, Math.min(380, root.width - 32)) - border.color: root.theme.colors.border - border.width: 1 - - MouseArea { - anchors.fill: parent - } - - ColumnLayout { - id: dialogContent - - anchors.fill: parent - anchors.margins: 16 - spacing: 14 - - Text { - color: root.theme.colors.textPrimary - font.bold: true - font.pixelSize: 17 - text: qsTr("Confirm swap") - Layout.fillWidth: true - } - - ColumnLayout { - spacing: 10 - Layout.fillWidth: true - - Rectangle { - Layout.fillWidth: true - color: root.theme.colors.inputBg - radius: 12 - implicitHeight: payColumn.implicitHeight + 24 - - ColumnLayout { - id: payColumn - anchors.fill: parent - anchors.margins: 12 - spacing: 4 - - Text { - text: qsTr("You pay") - color: root.theme.colors.textSecondary - font.pixelSize: 12 - Layout.fillWidth: true - } - Text { - text: qsTr("%1 %2") - .arg(root.snapshot.sellAmount || "") - .arg(root.snapshot.sellToken || "") - color: root.theme.colors.textPrimary - font.bold: true - font.pixelSize: 18 - elide: Text.ElideRight - Layout.fillWidth: true - } - } - } - - Rectangle { - Layout.fillWidth: true - color: root.theme.colors.inputBg - radius: 12 - implicitHeight: receiveColumn.implicitHeight + 24 - - ColumnLayout { - id: receiveColumn - anchors.fill: parent - anchors.margins: 12 - spacing: 4 - - Text { - text: qsTr("You receive at least") - color: root.theme.colors.textSecondary - font.pixelSize: 12 - Layout.fillWidth: true - } - Text { - text: qsTr("%1 %2") - .arg(root.snapshot.minReceived || "") - .arg(root.snapshot.buyToken || "") - color: root.theme.colors.textPrimary - font.bold: true - font.pixelSize: 18 - elide: Text.ElideRight - Layout.fillWidth: true - } - } - } - } - - SwapSummary { - Layout.fillWidth: true - theme: root.theme - swapModeText: root.snapshot.swapModeText || "" - feeText: root.snapshot.feeAmount || "" - priceImpactText: root.snapshot.priceImpactPercent || "" - priceImpactPercent: Number(root.snapshot.priceImpactPercentValue) || 0 - slippageText: root.snapshot.slippageTolerance || "" - minReceivedText: qsTr("%1 %2") - .arg(root.snapshot.minReceived || "") - .arg(root.snapshot.buyToken || "") - } - - RowLayout { - spacing: 10 - Layout.fillWidth: true - Layout.topMargin: 4 - - Button { - id: cancelButton - activeFocusOnTab: true - focusPolicy: Qt.StrongFocus - hoverEnabled: true - text: qsTr("Cancel") - Layout.fillWidth: true - Layout.minimumHeight: 48 - onClicked: root.cancel() - - contentItem: Text { - color: root.theme.colors.textPrimary - elide: Text.ElideRight - font.bold: true - font.pixelSize: 14 - horizontalAlignment: Text.AlignHCenter - text: cancelButton.text - verticalAlignment: Text.AlignVCenter - } - background: Rectangle { - border.color: root.theme.colors.borderStrong - border.width: 1 - color: cancelButton.pressed - ? root.theme.colors.panelHoverBg - : cancelButton.hovered || cancelButton.activeFocus - ? root.theme.colors.panelBg - : "transparent" - radius: 14 - } - } - - Button { - id: confirmButton - activeFocusOnTab: true - focusPolicy: Qt.StrongFocus - hoverEnabled: true - text: qsTr("Confirm Swap") - Layout.fillWidth: true - Layout.minimumHeight: 48 - onClicked: root.confirm() - - contentItem: Text { - color: "#ffffff" - elide: Text.ElideRight - font.bold: true - font.pixelSize: 14 - horizontalAlignment: Text.AlignHCenter - text: confirmButton.text - verticalAlignment: Text.AlignVCenter - } - background: Rectangle { - border.width: 0 - color: confirmButton.pressed - ? "#D95C1E" - : confirmButton.hovered || confirmButton.activeFocus - ? root.theme.colors.ctaHoverBg - : root.theme.colors.ctaBg - radius: 14 - } - } - } - } - } -} diff --git a/apps/amm/qml/components/swap/SwapConfirmationSummary.qml b/apps/amm/qml/components/swap/SwapConfirmationSummary.qml new file mode 100644 index 0000000..c3ff22e --- /dev/null +++ b/apps/amm/qml/components/swap/SwapConfirmationSummary.qml @@ -0,0 +1,88 @@ +import QtQuick +import QtQuick.Layouts + +ColumnLayout { + id: root + + property var theme + property var snapshot: ({}) + + spacing: 10 + + Rectangle { + Layout.fillWidth: true + color: root.theme.colors.inputBg + radius: 8 + implicitHeight: payColumn.implicitHeight + 24 + + ColumnLayout { + id: payColumn + anchors.fill: parent + anchors.margins: 12 + spacing: 4 + + Text { + Layout.fillWidth: true + text: qsTr("You pay") + color: root.theme.colors.textSecondary + font.pixelSize: 12 + } + + Text { + Layout.fillWidth: true + text: qsTr("%1 %2") + .arg(root.snapshot.sellAmount || "") + .arg(root.snapshot.sellToken || "") + color: root.theme.colors.textPrimary + font.bold: true + font.pixelSize: 18 + elide: Text.ElideRight + } + } + } + + Rectangle { + Layout.fillWidth: true + color: root.theme.colors.inputBg + radius: 8 + implicitHeight: receiveColumn.implicitHeight + 24 + + ColumnLayout { + id: receiveColumn + anchors.fill: parent + anchors.margins: 12 + spacing: 4 + + Text { + Layout.fillWidth: true + text: qsTr("You receive at least") + color: root.theme.colors.textSecondary + font.pixelSize: 12 + } + + Text { + Layout.fillWidth: true + text: qsTr("%1 %2") + .arg(root.snapshot.minReceived || "") + .arg(root.snapshot.buyToken || "") + color: root.theme.colors.textPrimary + font.bold: true + font.pixelSize: 18 + elide: Text.ElideRight + } + } + } + + SwapSummary { + Layout.fillWidth: true + theme: root.theme + swapModeText: root.snapshot.swapModeText || "" + feeText: root.snapshot.feeAmount || "" + priceImpactText: root.snapshot.priceImpactPercent || "" + priceImpactPercent: Number(root.snapshot.priceImpactPercentValue) || 0 + slippageText: root.snapshot.slippageTolerance || "" + minReceivedText: qsTr("%1 %2") + .arg(root.snapshot.minReceived || "") + .arg(root.snapshot.buyToken || "") + } +} diff --git a/apps/amm/qml/components/wallet/AccountControl.qml b/apps/amm/qml/components/wallet/AccountControl.qml deleted file mode 100644 index 9956eeb..0000000 --- a/apps/amm/qml/components/wallet/AccountControl.qml +++ /dev/null @@ -1,490 +0,0 @@ -import QtQuick -import QtQml -import QtQuick.Controls -import QtQuick.Layouts - -import Logos.Theme -import Logos.Controls - -// Header wallet control (Uniswap-style), with two states: -// - not connected → a "Connect" button that opens the create-wallet modal -// - connected → a single button showing the active account address; -// clicking it opens a popup (top-right, just under the -// button) holding the account selector, create-account and -// disconnect actions. -// The selected account address is exposed via selectedAddress for the -// trade/liquidity flows to use as the "from" account. -Item { - id: root - - // Backend replica (logos.module("amm_ui")) and its account model. - property var backend: null - property var accountModel: null - - readonly property bool connected: backend !== null && backend.isWalletOpen - - // Index of the active account. selectedAddress/selectedName are derived from - // the model mirror below so they stay valid while the popup (and its list) - // is closed. - property int selectedIndex: 0 - - // Non-visual mirror of the account model: realizes every row regardless of - // popup visibility, so the active account is addressable by index at all - // times (a ListView only realizes rows while it is shown). - Instantiator { - id: accounts - model: root.accountModel - delegate: QtObject { - readonly property string address: model.address ?? "" - readonly property string name: model.name ?? "" - readonly property string balance: model.balance ?? "" - readonly property bool isPublic: model.isPublic ?? false - } - } - - function entryAt(i) { - return (i >= 0 && i < accounts.count) ? accounts.objectAt(i) : null - } - - readonly property string selectedAddress: { - const e = root.entryAt(root.selectedIndex) - return e ? e.address : "" - } - readonly property string selectedName: { - const e = root.entryAt(root.selectedIndex) - return e ? e.name : "" - } - readonly property string selectedBalance: { - const e = root.entryAt(root.selectedIndex) - return e ? e.balance : "" - } - readonly property bool selectedIsPublic: { - const e = root.entryAt(root.selectedIndex) - return e ? e.isPublic : false - } - - // Keep the selection within bounds as accounts are added/removed. - function clampSelection() { - if (accounts.count === 0) { root.selectedIndex = 0; return } - if (root.selectedIndex < 0) root.selectedIndex = 0 - else if (root.selectedIndex >= accounts.count) root.selectedIndex = accounts.count - 1 - } - Connections { - target: root.accountModel - ignoreUnknownSignals: true - function onModelReset() { root.clampSelection() } - function onRowsInserted() { root.clampSelection() } - function onRowsRemoved() { root.clampSelection() } - } - - // 0x123456…cdef style truncation for the connected button label. - function truncated(addr) { - if (!addr) return "" - return addr.length > 13 ? (addr.substring(0, 6) + "…" + addr.substring(addr.length - 4)) : addr - } - - // Copy on the QML/view side. Routing this through the backend would call - // QGuiApplication::clipboard() in the (headless) module host process, which - // has no clipboard — that call tears the backend down, dropping the wallet - // connection. A hidden TextEdit copies via the GUI process that owns it. - TextEdit { id: clipboardProxy; visible: false } - function copyToClipboard(text) { - if (!text) return - clipboardProxy.text = text - clipboardProxy.selectAll() - clipboardProxy.copy() - clipboardProxy.deselect() - clipboardProxy.text = "" - } - - implicitWidth: root.connected ? connectedButton.width : connectButton.width - implicitHeight: 40 - - // ── Disconnected: Connect ──────────────────────────────────────────── - LogosButton { - id: connectButton - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - height: 40 - visible: !root.connected - enabled: root.backend !== null - text: qsTr("Connect") - onClicked: { - // Re-open an existing wallet; only show the create modal on first run. - if (root.backend && root.backend.walletExists) - logos.watch(root.backend.openExisting(), - function(ok) { if (!ok) console.warn("openExisting failed") }, - function(error) { console.warn("openExisting error:", error) }) - else - createWalletDialog.open() - } - } - - // ── Connected: address pill that toggles the wallet menu ───────────── - Rectangle { - id: connectedButton - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - visible: root.connected - implicitHeight: 40 - implicitWidth: connectedRow.implicitWidth + Theme.spacing.medium * 2 - radius: height / 2 - // Keep an opaque dark fill in both states: the navbar is white, and the - // active "muted" fill is translucent gray, which renders light over white - // and makes the white label unreadable. Signal "open" with an accent - // border instead. - color: Theme.palette.backgroundSecondary - border.width: 1 - border.color: walletMenu.opened ? Theme.palette.overlayOrange : "transparent" - - RowLayout { - id: connectedRow - anchors.centerIn: parent - spacing: Theme.spacing.small - - Rectangle { - Layout.preferredWidth: 8 - Layout.preferredHeight: 8 - radius: 4 - color: "#39c06a" - } - LogosText { - text: root.truncated(root.selectedAddress) || qsTr("Connected") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.text - } - LogosText { - text: walletMenu.opened ? "▴" : "▾" - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - } - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - // CloseOnPressOutside already dismisses the popup on this same press - // (the button is outside it), so `opened` is false by the time this - // fires. Without the recency guard the dismissing click would just - // reopen it. If it just closed, leave it closed. - onClicked: { - if (walletMenu.opened || (Date.now() - walletMenu.lastClosedMs) < 200) - walletMenu.close() - else - walletMenu.open() - } - } - } - - // ── Wallet menu popup (top-right, under the connected button) ───────── - Popup { - id: walletMenu - parent: connectedButton - y: connectedButton.height + Theme.spacing.small - x: connectedButton.width - width // right-align under the button - width: 360 - padding: Theme.spacing.medium - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - - // Timestamp of the last dismissal, used by the toggle button to tell a - // genuine "open" click from the press that just closed the popup. - property real lastClosedMs: 0 - onClosed: { - walletMenu.lastClosedMs = Date.now() - // Always reopen on the main (selected-account) view. - if (viewStack.depth > 1) - viewStack.pop(null, StackView.Immediate) - } - - background: Rectangle { - color: Theme.palette.backgroundTertiary - border.width: 1 - border.color: Theme.palette.backgroundElevated - radius: Theme.spacing.radiusLarge - } - - // Two stacked views: the main view (active account + actions) and the - // accounts view (full list + create). The popup height follows the - // active view's natural height, animated so the resize isn't abrupt. - contentItem: StackView { - id: viewStack - clip: true - implicitWidth: walletMenu.availableWidth - implicitHeight: currentItem ? currentItem.implicitHeight : 0 - initialItem: mainView - - Behavior on implicitHeight { - NumberAnimation { duration: 160; easing.type: Easing.OutCubic } - } - - pushEnter: Transition { NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 120 } } - pushExit: Transition { NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 120 } } - popEnter: Transition { NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 120 } } - popExit: Transition { NumberAnimation { property: "opacity"; from: 1; to: 0; duration: 120 } } - } - - // ── Main view: account icon + power icon, then the active account ── - Component { - id: mainView - - ColumnLayout { - spacing: Theme.spacing.medium - - // Top-right actions: open the account list / disconnect. - RowLayout { - Layout.fillWidth: true - spacing: Theme.spacing.small - - Item { Layout.fillWidth: true } - - WalletIconButton { - iconSource: Qt.resolvedUrl("icons/account.svg") - onClicked: viewStack.push(accountsView) - } - WalletIconButton { - iconSource: Qt.resolvedUrl("icons/settings.svg") - onClicked: viewStack.push(settingsView) - } - WalletIconButton { - iconSource: Qt.resolvedUrl("icons/power.svg") - onClicked: { - walletMenu.close() - if (root.backend) root.backend.disconnectWallet() - } - } - } - - // Active account card. - Rectangle { - Layout.fillWidth: true - Layout.preferredHeight: cardColumn.implicitHeight + Theme.spacing.medium * 2 - radius: Theme.spacing.radiusLarge - color: Theme.palette.backgroundMuted - - ColumnLayout { - id: cardColumn - anchors.fill: parent - anchors.margins: Theme.spacing.medium - spacing: Theme.spacing.small - - RowLayout { - Layout.fillWidth: true - spacing: Theme.spacing.small - - LogosText { - text: root.selectedName - font.pixelSize: Theme.typography.secondaryText - font.bold: true - } - Rectangle { - Layout.preferredWidth: tagLabel.implicitWidth + Theme.spacing.small * 2 - Layout.preferredHeight: tagLabel.implicitHeight + 4 - radius: 4 - color: Theme.palette.backgroundSecondary - LogosText { - id: tagLabel - anchors.centerIn: parent - text: root.selectedIsPublic ? qsTr("Public") : qsTr("Private") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - } - } - Item { Layout.fillWidth: true } - LogosText { - text: root.selectedBalance.length > 0 ? root.selectedBalance : "—" - font.bold: true - } - } - - RowLayout { - Layout.fillWidth: true - spacing: 0 - LogosText { - Layout.fillWidth: true - verticalAlignment: Text.AlignVCenter - text: root.selectedAddress - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textMuted - elide: Text.ElideMiddle - } - LogosCopyButton { - Layout.preferredHeight: 40 - Layout.preferredWidth: 40 - visible: root.selectedAddress.length > 0 - onCopyText: root.copyToClipboard(root.selectedAddress) - icon.color: Theme.palette.textMuted - } - } - } - } - } - } - - // ── Accounts view: back + full list + create ────────────────────── - Component { - id: accountsView - - ColumnLayout { - spacing: Theme.spacing.medium - - // Header: back to the main view + title. - RowLayout { - Layout.fillWidth: true - spacing: Theme.spacing.small - - WalletIconButton { - iconSource: Qt.resolvedUrl("icons/back.svg") - onClicked: viewStack.pop() - } - LogosText { - Layout.fillWidth: true - text: qsTr("Accounts") - font.bold: true - color: Theme.palette.text - } - } - - // Account list: tap a row to make it the active account, then - // return to the main view so the selection is reflected. - ListView { - Layout.fillWidth: true - Layout.preferredHeight: Math.min(contentHeight, 260) - clip: true - model: root.accountModel - spacing: Theme.spacing.small - ScrollIndicator.vertical: ScrollIndicator { } - - delegate: AccountDelegate { - width: ListView.view.width - highlighted: index === root.selectedIndex - onClicked: { - root.selectedIndex = index - viewStack.pop() - } - onCopyRequested: (text) => root.copyToClipboard(text) - } - } - - LogosButton { - Layout.fillWidth: true - height: 40 - text: qsTr("Add") - // Leave the wallet menu open behind the (modal) dialog. - onClicked: createAccountDialog.open() - } - } - } - - // ── Settings view: back + editable network (sequencer) ──────────── - Component { - id: settingsView - - ColumnLayout { - spacing: Theme.spacing.medium - - // Header: back to the main view + title. - RowLayout { - Layout.fillWidth: true - spacing: Theme.spacing.small - - WalletIconButton { - iconSource: Qt.resolvedUrl("icons/back.svg") - onClicked: viewStack.pop() - } - LogosText { - Layout.fillWidth: true - text: qsTr("Settings") - font.bold: true - color: Theme.palette.text - } - } - - LogosText { - text: qsTr("Network (sequencer URL)") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - } - - LogosTextField { - id: seqField - Layout.fillWidth: true - placeholderText: "http://127.0.0.1:3040" - // Initialize from the live value without binding, so typing - // isn't clobbered when sequencerAddr updates after a save. - Component.onCompleted: text = root.backend ? root.backend.sequencerAddr : "" - } - - LogosText { - id: seqStatus - Layout.fillWidth: true - visible: text.length > 0 - wrapMode: Text.WordWrap - font.pixelSize: Theme.typography.secondaryText - property bool ok: false - color: ok ? Theme.palette.success : Theme.palette.error - } - - LogosButton { - Layout.fillWidth: true - height: 40 - text: qsTr("Save") - onClicked: { - if (!root.backend) return - seqStatus.text = "" - logos.watch(root.backend.changeSequencerAddr(seqField.text), - function(ok) { - seqStatus.ok = ok - seqStatus.text = ok ? qsTr("Network updated.") - : qsTr("Failed to update network.") - }, - function(error) { - seqStatus.ok = false - seqStatus.text = qsTr("Error: %1").arg(error) - }) - } - } - } - } - } - - // ── Dialogs ────────────────────────────────────────────────────────── - CreateWalletDialog { - id: createWalletDialog - walletHome: root.backend ? root.backend.walletHome : "" - onCreateWallet: function(password) { - if (!root.backend) return - // createNewDefault returns the new wallet's seed phrase (empty on - // failure). On success we hand it to the dialog, which switches to - // its backup page — we do NOT close here, so the user can't skip it. - logos.watch(root.backend.createNewDefault(password), - function(mnemonic) { - if (mnemonic && mnemonic.length > 0) - createWalletDialog.mnemonic = mnemonic - else - createWalletDialog.createError = qsTr("Failed to create wallet. Please try again.") - }, - function(error) { - createWalletDialog.createError = qsTr("Error creating wallet: %1").arg(error) - }) - } - onCopyRequested: function(text) { - if (root.backend) root.backend.copyToClipboard(text) - } - } - - CreateAccountDialog { - id: createAccountDialog - onCreatePublicRequested: { - if (!root.backend) return - logos.watch(root.backend.createAccountPublic(), - function(_id) { /* model updates via NOTIFY after refresh */ }, - function(error) { console.warn("createAccountPublic failed:", error) }) - } - onCreatePrivateRequested: { - if (!root.backend) return - logos.watch(root.backend.createAccountPrivate(), - function(_id) { /* model updates via NOTIFY after refresh */ }, - function(error) { console.warn("createAccountPrivate failed:", error) }) - } - } -} diff --git a/apps/amm/qml/components/wallet/AccountDelegate.qml b/apps/amm/qml/components/wallet/AccountDelegate.qml deleted file mode 100644 index 14c03ee..0000000 --- a/apps/amm/qml/components/wallet/AccountDelegate.qml +++ /dev/null @@ -1,84 +0,0 @@ -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts - -import Logos.Theme -import Logos.Controls - -// One account row in the account dropdown. Ported from the LEZ wallet UI. -ItemDelegate { - id: root - - // Emitted when the user clicks the copy icon; the parent view connects this - // to its QML-side clipboard helper (AccountControl.copyToClipboard). - signal copyRequested(string text) - - leftPadding: Theme.spacing.medium - rightPadding: Theme.spacing.medium - topPadding: Theme.spacing.medium - bottomPadding: Theme.spacing.medium - - background: Rectangle { - color: root.highlighted || root.hovered ? - Theme.palette.backgroundMuted : - Theme.palette.backgroundTertiary - radius: Theme.spacing.radiusLarge - } - - contentItem: ColumnLayout { - spacing: Theme.spacing.small - RowLayout { - Layout.fillWidth: true - spacing: Theme.spacing.small - - LogosText { - text: model.name ?? "" - font.pixelSize: Theme.typography.secondaryText - font.bold: true - } - - Rectangle { - Layout.preferredWidth: tagLabel.implicitWidth + Theme.spacing.small * 2 - Layout.preferredHeight: tagLabel.implicitHeight + 4 - radius: 4 - color: Theme.palette.backgroundSecondary - - LogosText { - id: tagLabel - anchors.centerIn: parent - text: model.isPublic ? qsTr("Public") : qsTr("Private") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - } - } - - Item { Layout.fillWidth: true } - - LogosText { - text: model.balance && model.balance.length > 0 ? model.balance : "—" - font.bold: true - } - } - - RowLayout { - Layout.fillWidth: true - spacing: 0 - LogosText { - id: addressLabel - Layout.fillWidth: true - verticalAlignment: Text.AlignVCenter - text: model.address ?? "" - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textMuted - elide: Text.ElideMiddle - } - LogosCopyButton { - Layout.preferredHeight: 40 - Layout.preferredWidth: 40 - onCopyText: root.copyRequested(model.address) - visible: addressLabel.text - icon.color: Theme.palette.textMuted - } - } - } -} diff --git a/apps/amm/qml/components/wallet/CreateAccountDialog.qml b/apps/amm/qml/components/wallet/CreateAccountDialog.qml deleted file mode 100644 index 8070795..0000000 --- a/apps/amm/qml/components/wallet/CreateAccountDialog.qml +++ /dev/null @@ -1,102 +0,0 @@ -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts - -import Logos.Theme -import Logos.Controls - -// Public/private account creation dialog. Ported from the LEZ wallet UI. -Popup { - id: root - - signal createPublicRequested() - signal createPrivateRequested() - - modal: true - dim: true - padding: Theme.spacing.large - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside - - // Center on the full-window overlay rather than the small navbar control - // this popup is declared inside. - parent: Overlay.overlay - anchors.centerIn: parent - width: 360 - - background: Rectangle { - color: Theme.palette.backgroundSecondary - radius: Theme.spacing.radiusXlarge - border.color: Theme.palette.backgroundElevated - } - - contentItem: ColumnLayout { - id: contentLayout - // Pin to the popup's padded width so children stay within the modal. - width: root.availableWidth - spacing: Theme.spacing.large - - LogosText { - text: qsTr("Create account") - font.pixelSize: Theme.typography.titleText - font.weight: Theme.typography.weightBold - color: Theme.palette.text - } - - LogosText { - text: qsTr("Choose account type.") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - Layout.topMargin: -Theme.spacing.small - } - - RowLayout { - Layout.fillWidth: true - spacing: Theme.spacing.medium - - ColumnLayout { - Layout.fillWidth: true - spacing: 0 - - LogosText { - text: qsTr("Private") - font.pixelSize: Theme.typography.primaryText - color: Theme.palette.text - } - LogosText { - text: qsTr("Private balance and activity.") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - wrapMode: Text.WordWrap - Layout.fillWidth: true - } - } - - LogosSwitch { - id: privateSwitch - checked: false - } - } - - RowLayout { - Layout.topMargin: Theme.spacing.medium - spacing: Theme.spacing.medium - Layout.fillWidth: true - LogosButton { - text: qsTr("Cancel") - Layout.fillWidth: true - onClicked: root.close() - } - LogosButton { - text: qsTr("Create") - Layout.fillWidth: true - onClicked: { - if (privateSwitch.checked) - root.createPrivateRequested() - else - root.createPublicRequested() - root.close() - } - } - } - } -} diff --git a/apps/amm/qml/components/wallet/CreateWalletDialog.qml b/apps/amm/qml/components/wallet/CreateWalletDialog.qml deleted file mode 100644 index 05c8d6e..0000000 --- a/apps/amm/qml/components/wallet/CreateWalletDialog.qml +++ /dev/null @@ -1,201 +0,0 @@ -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts - -import Logos.Theme -import Logos.Controls - -// Wallet creation modal. Two pages, driven by whether a mnemonic exists yet: -// 1. Password entry — emits createWallet(password); the parent creates the -// wallet and, on success, sets `mnemonic` to the returned seed phrase. -// 2. Seed-phrase backup — shows the mnemonic once and gates dismissal behind -// an explicit acknowledgement. This is the only time the phrase is shown, -// so the popup is not auto-dismissable while it is visible. -// Storage/config live at the per-app default (backend.walletHome) — no path -// picking. Opened from the navbar "Connect" button. -Popup { - id: root - - // Where the wallet will be stored, shown for transparency. - property string walletHome: "" - property string createError: "" - // Set by the parent to the BIP39 seed phrase once creation succeeds. A - // non-empty value flips the dialog to the backup page. - property string mnemonic: "" - - signal createWallet(string password) - signal copyRequested(string text) - - modal: true - dim: true - padding: Theme.spacing.large - // Once the wallet exists we must not let the user dismiss the modal (and - // lose the only view of their seed phrase) by clicking away or pressing Esc. - closePolicy: root.mnemonic.length > 0 - ? Popup.NoAutoClose - : (Popup.CloseOnEscape | Popup.CloseOnPressOutside) - // Center on the full-window overlay rather than the small navbar control - // this popup is declared inside. - parent: Overlay.overlay - anchors.centerIn: parent - width: 380 - - onOpened: { - passwordField.text = "" - confirmField.text = "" - root.createError = "" - root.mnemonic = "" - passwordField.forceActiveFocus() - } - - background: Rectangle { - color: Theme.palette.backgroundSecondary - radius: Theme.spacing.radiusXlarge - border.color: Theme.palette.backgroundElevated - } - - contentItem: ColumnLayout { - // Pin to the popup's padded width so long text wraps and fillWidth - // children don't push the layout wider than the modal. - width: root.availableWidth - spacing: 0 - - // ── Page 1: password entry ──────────────────────────────────────── - ColumnLayout { - id: passwordPage - visible: root.mnemonic.length === 0 - Layout.fillWidth: true - spacing: Theme.spacing.large - - LogosText { - text: qsTr("Create your wallet") - font.pixelSize: Theme.typography.titleText - font.weight: Theme.typography.weightBold - color: Theme.palette.text - } - - LogosText { - text: qsTr("Secure your wallet with a password. It will be stored on this device at %1.") - .arg(root.walletHome || qsTr("the default location")) - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - wrapMode: Text.WordWrap - Layout.fillWidth: true - Layout.topMargin: -Theme.spacing.small - } - - LogosTextField { - id: passwordField - Layout.fillWidth: true - placeholderText: qsTr("Password") - echoMode: TextInput.Password - Keys.onReturnPressed: createButton.tryCreate() - } - LogosTextField { - id: confirmField - Layout.fillWidth: true - placeholderText: qsTr("Confirm password") - echoMode: TextInput.Password - Keys.onReturnPressed: createButton.tryCreate() - } - - LogosText { - Layout.fillWidth: true - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.error - wrapMode: Text.WordWrap - visible: text.length > 0 - text: root.createError - } - - RowLayout { - Layout.topMargin: Theme.spacing.small - Layout.fillWidth: true - spacing: Theme.spacing.medium - LogosButton { - text: qsTr("Cancel") - Layout.fillWidth: true - onClicked: root.close() - } - LogosButton { - id: createButton - Layout.fillWidth: true - text: qsTr("Create Wallet") - function tryCreate() { - if (passwordField.text.length === 0) { - root.createError = qsTr("Password cannot be empty.") - } else if (passwordField.text !== confirmField.text) { - root.createError = qsTr("Passwords do not match.") - } else { - root.createError = "" - root.createWallet(passwordField.text) - } - } - onClicked: tryCreate() - } - } - } - - // ── Page 2: seed-phrase backup ──────────────────────────────────── - ColumnLayout { - id: backupPage - visible: root.mnemonic.length > 0 - Layout.fillWidth: true - spacing: Theme.spacing.large - - LogosText { - text: qsTr("Back up your recovery phrase") - font.pixelSize: Theme.typography.titleText - font.weight: Theme.typography.weightBold - color: Theme.palette.text - } - - LogosText { - text: qsTr("Write these words down in order and store them somewhere safe. Anyone with this phrase can control your wallet, and it will not be shown again — it is the only way to recover access.") - font.pixelSize: Theme.typography.secondaryText - color: Theme.palette.textSecondary - wrapMode: Text.WordWrap - Layout.fillWidth: true - Layout.topMargin: -Theme.spacing.small - } - - Rectangle { - Layout.fillWidth: true - radius: Theme.spacing.radiusLarge - color: Theme.palette.backgroundElevated - implicitHeight: phraseText.implicitHeight + 2 * Theme.spacing.medium - - LogosText { - id: phraseText - anchors.fill: parent - anchors.margins: Theme.spacing.medium - text: root.mnemonic - wrapMode: Text.WordWrap - lineHeight: 1.4 - font.pixelSize: Theme.typography.primaryText - font.weight: Theme.typography.weightBold - color: Theme.palette.text - } - } - - LogosButton { - Layout.fillWidth: true - text: qsTr("Copy to clipboard") - onClicked: root.copyRequested(root.mnemonic) - } - - LogosCheckbox { - id: ackCheck - Layout.fillWidth: true - text: qsTr("I have safely backed up my recovery phrase") - } - - LogosButton { - Layout.fillWidth: true - enabled: ackCheck.checked - text: qsTr("Continue") - onClicked: root.close() - } - } - } -} diff --git a/apps/amm/qml/components/wallet/LogosCopyButton.qml b/apps/amm/qml/components/wallet/LogosCopyButton.qml deleted file mode 100644 index 7c1d7bd..0000000 --- a/apps/amm/qml/components/wallet/LogosCopyButton.qml +++ /dev/null @@ -1,39 +0,0 @@ -import QtQuick -import QtQuick.Controls - -import Logos.Theme - -Button { - id: root - - signal copyText() - - implicitWidth: 24 - implicitHeight: 24 - display: AbstractButton.IconOnly - flat: true - - property string iconSource: Qt.resolvedUrl("icons/copy.svg") - - icon.source: root.iconSource - icon.width: 24 - icon.height: 24 - icon.color: Theme.palette.textSecondary - - function reset() { - iconSource = Qt.resolvedUrl("icons/copy.svg") - } - - Timer { - id: resetTimer - interval: 1500 - repeat: false - onTriggered: root.reset() - } - - onClicked: { - root.copyText() - root.iconSource = Qt.resolvedUrl("icons/checkmark.svg") - resetTimer.restart() - } -} diff --git a/apps/amm/qml/components/wallet/WalletIconButton.qml b/apps/amm/qml/components/wallet/WalletIconButton.qml deleted file mode 100644 index 61545e0..0000000 --- a/apps/amm/qml/components/wallet/WalletIconButton.qml +++ /dev/null @@ -1,25 +0,0 @@ -import QtQuick -import QtQuick.Controls - -import Logos.Theme - -// Small icon-only action button for the wallet menu. Uses the same Button + -// icon.source/icon.color path as LogosCopyButton, which renders reliably here -// (LogosIconButton's Image + MultiEffect shader path does not). -Button { - id: root - - property url iconSource - property color iconColor: Theme.palette.textSecondary - property int iconSize: 18 - - implicitWidth: 32 - implicitHeight: 32 - display: AbstractButton.IconOnly - flat: true - - icon.source: root.iconSource - icon.width: root.iconSize - icon.height: root.iconSize - icon.color: root.iconColor -} diff --git a/apps/amm/qml/components/wallet/icons/account.svg b/apps/amm/qml/components/wallet/icons/account.svg deleted file mode 100644 index 779d76a..0000000 --- a/apps/amm/qml/components/wallet/icons/account.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/amm/qml/components/wallet/icons/back.svg b/apps/amm/qml/components/wallet/icons/back.svg deleted file mode 100644 index 6960875..0000000 --- a/apps/amm/qml/components/wallet/icons/back.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/amm/qml/components/wallet/icons/checkmark.svg b/apps/amm/qml/components/wallet/icons/checkmark.svg deleted file mode 100644 index 2eabb54..0000000 --- a/apps/amm/qml/components/wallet/icons/checkmark.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/amm/qml/components/wallet/icons/copy.svg b/apps/amm/qml/components/wallet/icons/copy.svg deleted file mode 100644 index cfa6cf8..0000000 --- a/apps/amm/qml/components/wallet/icons/copy.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/amm/qml/components/wallet/icons/power.svg b/apps/amm/qml/components/wallet/icons/power.svg deleted file mode 100644 index 5900ca3..0000000 --- a/apps/amm/qml/components/wallet/icons/power.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/amm/qml/components/wallet/icons/settings.svg b/apps/amm/qml/components/wallet/icons/settings.svg deleted file mode 100644 index 77f89ae..0000000 --- a/apps/amm/qml/components/wallet/icons/settings.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/amm/qml/pages/LiquidityPage.qml b/apps/amm/qml/pages/LiquidityPage.qml index f471952..9dde13a 100644 --- a/apps/amm/qml/pages/LiquidityPage.qml +++ b/apps/amm/qml/pages/LiquidityPage.qml @@ -1,5 +1,6 @@ import QtQuick 2.15 import QtQuick.Layouts 1.15 +import Logos.Wallet import "../components/shared" import "../components/liquidity" import "../state" @@ -162,10 +163,18 @@ Item { } } - LiquidityConfirmationDialog { - id: confirmationDialog + Component { + id: liquidityConfirmationSummary - anchors.fill: parent + LiquidityConfirmationSummary { } + } + + TransactionConfirmationDialog { + id: confirmationDialog + title: snapshot.action === "add" + ? qsTr("Confirm add liquidity") + : qsTr("Confirm remove liquidity") + summary: liquidityConfirmationSummary onConfirmed: function (snapshot) { root.confirmLiquidityAction(snapshot); diff --git a/apps/amm/qml/pages/SwapPage.qml b/apps/amm/qml/pages/SwapPage.qml index 75b42d4..f4aca1a 100644 --- a/apps/amm/qml/pages/SwapPage.qml +++ b/apps/amm/qml/pages/SwapPage.qml @@ -1,9 +1,10 @@ +pragma ComponentBehavior: Bound + import QtQuick 2.15 -import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 +import Logos.Wallet import "../components/shared" import "../components/swap" -import "../state" Item { id: root @@ -18,7 +19,7 @@ Item { ] QtObject { - id: theme + id: pageTheme property bool isDark: true property var colors: isDark ? dark : light @@ -61,7 +62,7 @@ Item { Rectangle { anchors.fill: parent - color: theme.colors.background + color: pageTheme.colors.background Behavior on color { ColorAnimation { duration: 300 } } // Theme toggle @@ -70,19 +71,19 @@ Item { anchors.right: parent.right anchors.margins: 16 width: 44; height: 24; radius: 12 - color: theme.colors.panelBg - border.color: theme.colors.border + color: pageTheme.colors.panelBg + border.color: pageTheme.colors.border border.width: 1 Text { anchors.centerIn: parent - text: theme.isDark ? "☀" : "☾" + text: pageTheme.isDark ? "☀" : "☾" font.pixelSize: 13 - color: theme.colors.textSecondary + color: pageTheme.colors.textSecondary } MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: theme.isDark = !theme.isDark + onClicked: pageTheme.isDark = !pageTheme.isDark } } @@ -93,7 +94,7 @@ Item { SwapCard { id: swapCard Layout.alignment: Qt.AlignHCenter - theme: theme + theme: pageTheme tokens: root.tokens width: Math.min(480, root.width - 32) @@ -109,9 +110,9 @@ Item { Text { Layout.alignment: Qt.AlignHCenter - text: "Buy and sell crypto on LEZ." + text: "Buy and sell crypto on LEZ." textFormat: Text.RichText - color: theme.colors.textSecondary + color: pageTheme.colors.textSecondary font.pixelSize: 15 horizontalAlignment: Text.AlignHCenter } @@ -121,7 +122,7 @@ Item { id: tokenModal anchors.fill: parent z: 10 - theme: theme + theme: pageTheme tokens: root.tokens property string targetSide: "sell" @@ -144,10 +145,19 @@ Item { } } - SwapConfirmationDialog { + Component { + id: swapConfirmationSummary + + SwapConfirmationSummary { + theme: pageTheme + } + } + + TransactionConfirmationDialog { id: swapConfirmationDialog - anchors.fill: parent - theme: theme + title: qsTr("Confirm swap") + confirmText: qsTr("Confirm swap") + summary: swapConfirmationSummary onConfirmed: function(snapshot) { swapCard.resetAmounts() diff --git a/apps/amm/src/AccountModel.cpp b/apps/amm/src/AccountModel.cpp deleted file mode 100644 index 63992f8..0000000 --- a/apps/amm/src/AccountModel.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "AccountModel.h" - -#include - -AccountModel::AccountModel(QObject* parent) - : QAbstractListModel(parent) -{ -} - -int AccountModel::rowCount(const QModelIndex& parent) const -{ - if (parent.isValid()) - return 0; - return m_entries.size(); -} - -QVariant AccountModel::data(const QModelIndex& index, int role) const -{ - if (!index.isValid() || index.row() < 0 || index.row() >= m_entries.size()) - return QVariant(); - - const AccountEntry& e = m_entries.at(index.row()); - switch (role) { - case NameRole: return e.name; - case AddressRole: return e.address; - case BalanceRole: return e.balance; - case IsPublicRole: return e.isPublic; - default: return QVariant(); - } -} - -QHash AccountModel::roleNames() const -{ - return { - { NameRole, "name" }, - { AddressRole, "address" }, - { BalanceRole, "balance" }, - { IsPublicRole, "isPublic" } - }; -} - -void AccountModel::replaceFromJsonArray(const QJsonArray& arr) -{ - beginResetModel(); - const int oldCount = m_entries.size(); - m_entries.clear(); - int idx = 0; - for (const QJsonValue& v : arr) { - AccountEntry e; - e.name = QStringLiteral("Account %1").arg(++idx); - e.balance = QString(); - if (v.isObject()) { - const QJsonObject obj = v.toObject(); - e.address = obj.value(QStringLiteral("account_id")).toString(); - e.isPublic = obj.value(QStringLiteral("is_public")).toBool(true); - } else { - e.address = v.toString(); - e.isPublic = true; - } - m_entries.append(e); - } - endResetModel(); - if (oldCount != m_entries.size()) - emit countChanged(); -} - -void AccountModel::setBalanceByAddress(const QString& address, const QString& balance) -{ - for (int i = 0; i < m_entries.size(); ++i) { - if (m_entries.at(i).address == address) { - if (m_entries.at(i).balance != balance) { - m_entries[i].balance = balance; - const QModelIndex idx = index(i, 0); - emit dataChanged(idx, idx, { BalanceRole }); - } - return; - } - } -} diff --git a/apps/amm/src/AccountModel.h b/apps/amm/src/AccountModel.h deleted file mode 100644 index 918839c..0000000 --- a/apps/amm/src/AccountModel.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -// One wallet account row. Mirrors the shape returned by the core wallet -// module's list_accounts() (account_id + is_public), with a display name and -// a lazily-fetched balance. -struct AccountEntry { - QString name; - QString address; - QString balance; - bool isPublic = true; -}; - -// QAbstractListModel of wallet accounts, exposed to QML via -// logos.model("amm_ui", "accountModel"). Ported from the LEZ wallet UI. -class AccountModel : public QAbstractListModel { - Q_OBJECT - Q_PROPERTY(int count READ count NOTIFY countChanged) -public: - enum Role { - NameRole = Qt::UserRole + 1, - AddressRole, - BalanceRole, - IsPublicRole - }; - Q_ENUM(Role) - - explicit AccountModel(QObject* parent = nullptr); - - int rowCount(const QModelIndex& parent = QModelIndex()) const override; - QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; - QHash roleNames() const override; - - void replaceFromJsonArray(const QJsonArray& arr); - void setBalanceByAddress(const QString& address, const QString& balance); - int count() const { return m_entries.size(); } - -signals: - void countChanged(); - -private: - QVector m_entries; -}; diff --git a/apps/amm/src/AmmUiBackend.cpp b/apps/amm/src/AmmUiBackend.cpp index f937d03..c2e75a6 100644 --- a/apps/amm/src/AmmUiBackend.cpp +++ b/apps/amm/src/AmmUiBackend.cpp @@ -1,15 +1,8 @@ #include "AmmUiBackend.h" -#include -#include #include #include -#include #include -#include -#include -#include -#include #include #include #include @@ -17,27 +10,21 @@ #include #include +#include "LogosWalletProvider.h" #include "logos_api.h" -#include "logos_sdk.h" namespace { - const char SETTINGS_ORG[] = "Logos"; - const char SETTINGS_APP[] = "AmmUI"; - // Sticky "user pressed Disconnect" flag so the wallet stays locked across - // relaunches until the user reconnects. - const char DISCONNECTED_KEY[] = "disconnected"; - const int WALLET_FFI_SUCCESS = 0; +const char SETTINGS_ORG[] = "Logos"; +const char SETTINGS_APP[] = "AmmUI"; +const char DISCONNECTED_KEY[] = "disconnected"; +const char WALLET_HOME_ENV[] = "LEE_WALLET_HOME_DIR"; - // Wallet home env override. Mirrors LEZ's own var so the app shares the - // canonical wallet (~/.lee/wallet) used by the wallet UI and other apps. - const char WALLET_HOME_ENV[] = "LEE_WALLET_HOME_DIR"; - - // Normalise file:// URLs and OS paths to a plain local path. - QString toLocalPath(const QString& path) { - if (path.startsWith("file://") || path.contains("/")) - return QUrl::fromUserInput(path).toLocalFile(); - return path; - } +QString toLocalPath(const QString& path) +{ + if (path.startsWith(QStringLiteral("file://")) || path.contains(QLatin1Char('/'))) + return QUrl::fromUserInput(path).toLocalFile(); + return path; +} } QString AmmUiBackend::defaultWalletHome() @@ -45,8 +32,6 @@ QString AmmUiBackend::defaultWalletHome() const QByteArray override = qgetenv(WALLET_HOME_ENV); if (!override.isEmpty()) return QString::fromLocal8Bit(override); - // LEZ's canonical wallet home, shared with the wallet UI and other LEZ apps - // (matches lez/wallet get_home_default_path()). return QDir::homePath() + QStringLiteral("/.lee/wallet"); } @@ -62,286 +47,196 @@ QString AmmUiBackend::defaultStoragePath() const AmmUiBackend::AmmUiBackend(LogosAPI* logosAPI, QObject* parent) : AmmUiBackendSimpleSource(parent), - m_accountModel(new AccountModel(this)), + m_accountModel(new WalletAccountModel(this)), m_logosAPI(logosAPI ? logosAPI : new LogosAPI("amm_ui", this)), - m_logos(new LogosModules(m_logosAPI)), + m_wallet(std::make_unique(m_logosAPI)), m_net(new QNetworkAccessManager(this)), m_reachabilityTimer(new QTimer(this)) { - // PROP defaults via the generated setters. setIsWalletOpen(false); setLastSyncedBlock(0); setCurrentBlockHeight(0); setWalletHome(defaultWalletHome()); - // Assume reachable until a probe proves otherwise (avoids a startup flash). setSequencerReachable(true); + setWalletExists(QFileInfo::exists(defaultStoragePath())); - // Periodically re-probe the sequencer so the banner reacts to a node going - // up/down while the app is running. Probes are no-ops until a wallet (and - // thus a sequencer address) is open. m_reachabilityTimer->setInterval(10000); - connect(m_reachabilityTimer, &QTimer::timeout, this, [this]() { checkReachability(); }); + connect(m_reachabilityTimer, &QTimer::timeout, + this, &AmmUiBackend::checkReachability); m_reachabilityTimer->start(); - // Always resolve against the canonical wallet home (LEE_WALLET_HOME_DIR or - // ~/.lee/wallet). We intentionally don't seed config/storage paths from - // QSettings anymore: a previously-persisted per-app path (~/.lee/amm-wallet) - // would otherwise override the default and pin the app to the old keystore. - - // A wallet exists on disk if its storage file is present (drives whether - // the navbar "Connect" reconnects or offers to create a wallet). - const QString effectiveStorage = storagePath().isEmpty() ? defaultStoragePath() : storagePath(); - setWalletExists(QFileInfo::exists(effectiveStorage)); - - // ui-host runs our constructor inside initLogos(), synchronously, BEFORE - // it enables remoting and emits READY. Any blocking RPC here would stall - // ui-host startup past its ready watchdog. Defer the open+refresh chain to - // the first event-loop tick so ui-host finishes wiring itself up first. - QTimer::singleShot(0, this, [this]() { openOrAdoptWallet(); }); - - // Save wallet on quit; host may not call destructors so this is best-effort. - connect(qApp, &QCoreApplication::aboutToQuit, this, - [this]() { saveWallet(); }, Qt::DirectConnection); + QTimer::singleShot(0, this, &AmmUiBackend::openOrAdoptWallet); } -AmmUiBackend::~AmmUiBackend() -{ - saveWallet(); - delete m_logos; -} +AmmUiBackend::~AmmUiBackend() = default; void AmmUiBackend::openOrAdoptWallet() { - // Respect an explicit user disconnect: stay locked, show "Connect". if (QSettings(SETTINGS_ORG, SETTINGS_APP).value(DISCONNECTED_KEY, false).toBool()) return; - // In Basecamp the logos_execution_zone module is a single shared instance, - // so the wallet may already be open (e.g. opened by the dedicated wallet - // app). Adopt that wallet instead of fighting over it: mirror its state - // rather than re-opening from disk, which could clobber unsaved in-memory - // accounts the other app holds. A freshly-created shared wallet can be open - // with zero accounts, so we can't key off list_accounts() alone (see - // sharedWalletIsOpen). - if (sharedWalletIsOpen()) { - const QJsonArray existing = QJsonArray::fromVariantList(m_logos->logos_execution_zone.list_accounts()); - qDebug() << "AmmUiBackend: adopting already-open shared wallet" - << existing.size() << "accounts"; - setIsWalletOpen(true); - m_accountModel->replaceFromJsonArray(existing); - refreshBalances(); - refreshSequencerAddr(); + const QString config = defaultConfigPath(); + const QString storage = defaultStoragePath(); + const WalletSession session = m_wallet->connect({ config, storage }); + if (session.failure == WalletFailure::WalletMissing) + return; + if (!session.ok()) { + qWarning() << "AmmUiBackend: wallet connection failed" + << walletFailureCode(session.failure); return; } - // Standalone (own core instance): auto-open a previously-created wallet. - // Use persisted paths if the user picked custom ones, else the per-app - // default. Only open if the storage actually exists, otherwise stay closed - // so QML shows the "Connect" entry point (no noisy FFI errors on first run). - const QString cfg = configPath().isEmpty() ? defaultConfigPath() : configPath(); - const QString stg = storagePath().isEmpty() ? defaultStoragePath() : storagePath(); - if (!QFileInfo::exists(stg)) - return; // No wallet yet — QML shows "Connect". - - qDebug() << "AmmUiBackend: opening wallet with config" << cfg << "storage" << stg; - const int err = m_logos->logos_execution_zone.open(cfg, stg); - if (err == WALLET_FFI_SUCCESS) { - persistConfigPath(cfg); - persistStoragePath(stg); - setIsWalletOpen(true); - refreshAccounts(); - refreshBlockHeights(); - refreshSequencerAddr(); - } else { - qWarning() << "AmmUiBackend: wallet open failed, code" << err; - } -} - -bool AmmUiBackend::sharedWalletIsOpen() -{ - // list_accounts() is non-empty only once the wallet holds accounts, so it - // can't distinguish "no wallet open" from "open but empty" (a wallet that - // was just created and hasn't had an account added yet). Fall back to a - // handle-dependent, account-independent signal: an open wallet always has a - // sequencer address (from its config, defaulted on open), while a closed - // core returns an empty string. This lets us adopt a freshly-created shared - // wallet instead of falling through and re-opening it from disk. - if (!QJsonArray::fromVariantList(m_logos->logos_execution_zone.list_accounts()).isEmpty()) - return true; - return !m_logos->logos_execution_zone.get_sequencer_addr().isEmpty(); + persistConfigPath(config); + persistStoragePath(storage); + setWalletExists(QFileInfo::exists(storage) || session.adopted); + setIsWalletOpen(true); + applySnapshot(session.snapshot); } QString AmmUiBackend::createNewDefault(QString password) { - QDir().mkpath(defaultWalletHome()); return createNew(defaultConfigPath(), defaultStoragePath(), password); } -QString AmmUiBackend::createNew(QString configPath, QString storagePath, QString password) +QString AmmUiBackend::createNew(QString configPath, + QString storagePath, + QString password) { - const QString localConfig = toLocalPath(configPath); - const QString localStorage = toLocalPath(storagePath); - // create_new returns the new wallet's BIP39 mnemonic (empty on failure). We - // hand it back to the caller instead of discarding it: wallet creation is - // the only moment the seed phrase is recoverable, so the UI must force a - // backup step before the user can proceed. - const QString mnemonic = m_logos->logos_execution_zone.create_new(localConfig, localStorage, password); - if (mnemonic.isEmpty()) { - qWarning() << "AmmUiBackend: create_new failed (empty mnemonic)"; - return QString(); + const QString config = toLocalPath(configPath); + const QString storage = toLocalPath(storagePath); + const WalletCreation creation = m_wallet->createWallet( + { config, storage }, password); + if (creation.mnemonic.isEmpty()) { + qWarning() << "AmmUiBackend: wallet creation failed" + << walletFailureCode(creation.failure); + return {}; } - persistConfigPath(localConfig); - persistStoragePath(localStorage); + persistConfigPath(config); + persistStoragePath(storage); setWalletExists(true); QSettings(SETTINGS_ORG, SETTINGS_APP).setValue(DISCONNECTED_KEY, false); + if (!creation.ok()) { + qWarning() << "AmmUiBackend: wallet creation failed" + << walletFailureCode(creation.failure); + return creation.mnemonic; + } + setIsWalletOpen(true); - refreshAccounts(); - refreshBlockHeights(); - refreshSequencerAddr(); - return mnemonic; + applySnapshot(creation.snapshot); + return creation.mnemonic; } bool AmmUiBackend::openExisting() { - // Adopt a shared open wallet (Basecamp), else open our own from disk. A - // freshly-created shared wallet can be open with zero accounts, so probe - // open-ness rather than keying off list_accounts() alone. - if (sharedWalletIsOpen()) { - const QJsonArray existing = QJsonArray::fromVariantList(m_logos->logos_execution_zone.list_accounts()); - setIsWalletOpen(true); - m_accountModel->replaceFromJsonArray(existing); - refreshBalances(); - refreshSequencerAddr(); - QSettings(SETTINGS_ORG, SETTINGS_APP).setValue(DISCONNECTED_KEY, false); - return true; - } - - const QString cfg = configPath().isEmpty() ? defaultConfigPath() : configPath(); - const QString stg = storagePath().isEmpty() ? defaultStoragePath() : storagePath(); - if (!QFileInfo::exists(stg)) - return false; - - const int err = m_logos->logos_execution_zone.open(cfg, stg); - if (err != WALLET_FFI_SUCCESS) { - qWarning() << "AmmUiBackend: openExisting failed, code" << err; + const QString config = configPath().isEmpty() ? defaultConfigPath() : configPath(); + const QString storage = storagePath().isEmpty() ? defaultStoragePath() : storagePath(); + const WalletSession session = m_wallet->connect({ config, storage }); + if (!session.ok()) { + qWarning() << "AmmUiBackend: wallet open failed" + << walletFailureCode(session.failure); return false; } - persistConfigPath(cfg); - persistStoragePath(stg); + + persistConfigPath(config); + persistStoragePath(storage); + setWalletExists(true); setIsWalletOpen(true); QSettings(SETTINGS_ORG, SETTINGS_APP).setValue(DISCONNECTED_KEY, false); - refreshAccounts(); - refreshBlockHeights(); - refreshSequencerAddr(); + applySnapshot(session.snapshot); return true; } void AmmUiBackend::disconnectWallet() { - // UI-local lock: persist wallet state, drop our view of it, and remember - // the choice. We do NOT close the core module's wallet handle — in Basecamp - // that instance is shared with other apps. - saveWallet(); + m_wallet->disconnect(); setIsWalletOpen(false); - m_accountModel->replaceFromJsonArray(QJsonArray()); + m_accountModel->replaceAccounts({}); QSettings(SETTINGS_ORG, SETTINGS_APP).setValue(DISCONNECTED_KEY, true); } QString AmmUiBackend::createAccountPublic() { - const QString result = m_logos->logos_execution_zone.create_account_public(); - if (!result.isEmpty()) - refreshAccounts(); - return result; + const WalletAccountCreation creation = m_wallet->createAccount(true); + if (!creation.ok()) { + qWarning() << "AmmUiBackend: public account creation failed" + << walletFailureCode(creation.failure); + return {}; + } + if (creation.snapshot.ok()) + applySnapshot(creation.snapshot); + else + qWarning() << "AmmUiBackend: account refresh failed" + << walletFailureCode(creation.snapshot.failure); + return creation.accountId; } QString AmmUiBackend::createAccountPrivate() { - const QString result = m_logos->logos_execution_zone.create_account_private(); - if (!result.isEmpty()) - refreshAccounts(); - return result; + const WalletAccountCreation creation = m_wallet->createAccount(false); + if (!creation.ok()) { + qWarning() << "AmmUiBackend: private account creation failed" + << walletFailureCode(creation.failure); + return {}; + } + if (creation.snapshot.ok()) + applySnapshot(creation.snapshot); + else + qWarning() << "AmmUiBackend: account refresh failed" + << walletFailureCode(creation.snapshot.failure); + return creation.accountId; } void AmmUiBackend::refreshAccounts() { - const QJsonArray arr = QJsonArray::fromVariantList(m_logos->logos_execution_zone.list_accounts()); - m_accountModel->replaceFromJsonArray(arr); - refreshBalances(); + const WalletSnapshot next = m_wallet->snapshot(true); + if (next.ok()) + applySnapshot(next); + else + qWarning() << "AmmUiBackend: wallet refresh failed" + << walletFailureCode(next.failure); } void AmmUiBackend::refreshBalances() { - refreshBlockHeights(); - if (currentBlockHeight() > 0) - m_logos->logos_execution_zone.sync_to_block(static_cast(currentBlockHeight())); - - for (int i = 0; i < m_accountModel->count(); ++i) { - const QModelIndex idx = m_accountModel->index(i, 0); - const QString addr = m_accountModel->data(idx, AccountModel::AddressRole).toString(); - const bool isPub = m_accountModel->data(idx, AccountModel::IsPublicRole).toBool(); - m_accountModel->setBalanceByAddress(addr, getBalance(addr, isPub)); - } - saveWallet(); + refreshAccounts(); } QString AmmUiBackend::getBalance(QString accountIdHex, bool isPublic) { - return m_logos->logos_execution_zone.get_balance(accountIdHex, isPublic); + const WalletSnapshot current = m_wallet->snapshot(); + for (const WalletAccount& account : current.accounts) { + if (account.address == accountIdHex && account.isPublic == isPublic) + return account.balance; + } + return {}; } -void AmmUiBackend::refreshBlockHeights() +void AmmUiBackend::applySnapshot(const WalletSnapshot& snapshot) { - const int lastVal = m_logos->logos_execution_zone.get_last_synced_block(); - const int currentVal = m_logos->logos_execution_zone.get_current_block_height(); - if (lastSyncedBlock() != lastVal) - setLastSyncedBlock(lastVal); - if (currentBlockHeight() != currentVal) - setCurrentBlockHeight(currentVal); -} - -void AmmUiBackend::refreshSequencerAddr() -{ - const QString addr = m_logos->logos_execution_zone.get_sequencer_addr(); - if (sequencerAddr() != addr) - setSequencerAddr(addr); - // Probe right away so the banner reflects the (possibly new) endpoint - // without waiting for the next periodic tick. + m_accountModel->replaceAccounts(snapshot.accounts); + setLastSyncedBlock(static_cast(snapshot.lastSyncedBlock)); + setCurrentBlockHeight(static_cast(snapshot.currentBlockHeight)); + setSequencerAddr(snapshot.sequencerAddress); checkReachability(); } void AmmUiBackend::checkReachability() { - const QString addr = sequencerAddr(); - if (addr.isEmpty()) + if (sequencerAddr().isEmpty()) return; - QNetworkRequest req{QUrl(addr)}; - req.setTransferTimeout(4000); - QNetworkReply* reply = m_net->get(req); + QNetworkRequest request{QUrl(sequencerAddr())}; + request.setTransferTimeout(4000); + QNetworkReply* reply = m_net->get(request); connect(reply, &QNetworkReply::finished, this, [this, reply]() { - // Any HTTP response (even a 404) means the node is up; only a transport - // failure (connection refused, host not found, timeout) counts as down. - const bool gotHttpStatus = + const bool receivedHttp = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).isValid(); - const bool reachable = gotHttpStatus || reply->error() == QNetworkReply::NoError; - if (sequencerReachable() != reachable) - setSequencerReachable(reachable); + setSequencerReachable(receivedHttp || reply->error() == QNetworkReply::NoError); reply->deleteLater(); }); } -void AmmUiBackend::saveWallet() -{ - if (isWalletOpen()) - m_logos->logos_execution_zone.save(); -} - -// These only update the in-session PROPs (so subsequent open/refresh calls -// reuse the same path). They are no longer written to QSettings: the app -// always resolves against the canonical wallet home, so there's nothing to -// remember across launches. void AmmUiBackend::persistConfigPath(const QString& path) { setConfigPath(toLocalPath(path)); @@ -351,51 +246,3 @@ void AmmUiBackend::persistStoragePath(const QString& path) { setStoragePath(toLocalPath(path)); } - -bool AmmUiBackend::changeSequencerAddr(QString url) -{ - const QString trimmed = url.trimmed(); - if (trimmed.isEmpty()) { - qWarning() << "AmmUiBackend: refusing to set empty sequencer_addr"; - return false; - } - - const QString cfg = configPath().isEmpty() ? defaultConfigPath() : configPath(); - - // Preserve the other config fields (poll timeouts, retries) — only swap the - // endpoint. The wallet reads this file on open via from_path_or_initialize_default. - QJsonObject obj; - QFile in(cfg); - if (in.open(QIODevice::ReadOnly)) { - obj = QJsonDocument::fromJson(in.readAll()).object(); - in.close(); - } - obj.insert(QStringLiteral("sequencer_addr"), trimmed); - - QFile out(cfg); - if (!out.open(QIODevice::WriteOnly | QIODevice::Truncate)) { - qWarning() << "AmmUiBackend: cannot write wallet config" << cfg; - return false; - } - out.write(QJsonDocument(obj).toJson(QJsonDocument::Indented)); - out.close(); - - // Re-open so the live wallet uses the new endpoint right away. - if (isWalletOpen()) { - const QString stg = storagePath().isEmpty() ? defaultStoragePath() : storagePath(); - const int err = m_logos->logos_execution_zone.open(cfg, stg); - if (err != WALLET_FFI_SUCCESS) { - qWarning() << "AmmUiBackend: reopen after sequencer change failed, code" << err; - return false; - } - refreshSequencerAddr(); - refreshAccounts(); - } - return true; -} - -void AmmUiBackend::copyToClipboard(QString text) -{ - if (QGuiApplication::clipboard()) - QGuiApplication::clipboard()->setText(text); -} diff --git a/apps/amm/src/AmmUiBackend.h b/apps/amm/src/AmmUiBackend.h index 14d1e80..48f370a 100644 --- a/apps/amm/src/AmmUiBackend.h +++ b/apps/amm/src/AmmUiBackend.h @@ -1,52 +1,41 @@ #ifndef AMM_UI_BACKEND_H #define AMM_UI_BACKEND_H -#include +#include + #include #include "rep_AmmUiBackend_source.h" -#include "AccountModel.h" +#include "WalletAccountModel.h" class LogosAPI; -struct LogosModules; +class LogosWalletProvider; class QNetworkAccessManager; class QTimer; -// Source-side implementation of the AmmUiBackend .rep interface. -// Inheriting from AmmUiBackendSimpleSource gives us the generated PROPs and -// SLOTs from AmmUiBackend.rep — all the simple ones flow over QtRO. Talks to -// the core logos_execution_zone wallet module via LogosModules. class AmmUiBackend : public AmmUiBackendSimpleSource { Q_OBJECT - Q_PROPERTY(AccountModel* accountModel READ accountModel CONSTANT) + Q_PROPERTY(WalletAccountModel* accountModel READ accountModel CONSTANT) public: explicit AmmUiBackend(LogosAPI* logosAPI = nullptr, QObject* parent = nullptr); ~AmmUiBackend() override; - AccountModel* accountModel() const { return m_accountModel; } + WalletAccountModel* accountModel() const { return m_accountModel; } public slots: - // Overrides of the pure-virtual slots generated from the .rep. QString createAccountPublic() override; QString createAccountPrivate() override; void refreshAccounts() override; void refreshBalances() override; QString getBalance(QString accountIdHex, bool isPublic) override; - // Return the new wallet's BIP39 mnemonic (empty string on failure) so the - // UI can force a one-time seed-phrase backup step. QString createNewDefault(QString password) override; QString createNew(QString configPath, QString storagePath, QString password) override; bool openExisting() override; void disconnectWallet() override; - bool changeSequencerAddr(QString url) override; - void copyToClipboard(QString text) override; private: - // Per-app wallet home (kept distinct from the wallet's canonical - // ~/.lee/wallet so standalone instances stay isolated; Basecamp sharing - // is handled by adopting an already-open shared wallet on startup). static QString defaultWalletHome(); QString defaultConfigPath() const; QString defaultStoragePath() const; @@ -54,22 +43,12 @@ private: void persistConfigPath(const QString& path); void persistStoragePath(const QString& path); void openOrAdoptWallet(); - // True when the shared core already has a wallet open — including a freshly - // created one with zero accounts. See the definition for why list_accounts() - // alone is insufficient. - bool sharedWalletIsOpen(); - void refreshBlockHeights(); - void refreshSequencerAddr(); - void saveWallet(); - - // Probe the configured sequencer over HTTP and update sequencerReachable. + void applySnapshot(const WalletSnapshot& snapshot); void checkReachability(); - AccountModel* m_accountModel; - + WalletAccountModel* m_accountModel; LogosAPI* m_logosAPI; - LogosModules* m_logos; - + std::unique_ptr m_wallet; QNetworkAccessManager* m_net; QTimer* m_reachabilityTimer; }; diff --git a/apps/amm/src/AmmUiBackend.rep b/apps/amm/src/AmmUiBackend.rep index c9e2d50..6023dbb 100644 --- a/apps/amm/src/AmmUiBackend.rep +++ b/apps/amm/src/AmmUiBackend.rep @@ -37,10 +37,4 @@ class AmmUiBackend // Basecamp, does not close the wallet other apps share. SLOT(void disconnectWallet()) - // Settings. Rewrites the wallet config's sequencer_addr and re-opens the - // wallet so the new network takes effect immediately. - SLOT(bool changeSequencerAddr(QString url)) - - // Misc - SLOT(void copyToClipboard(QString text)) }