From 27547875b68fa124130eb10960f713a830a04224 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 | 26 +-
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 | 16 +-
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 -
27 files changed, 846 insertions(+), 2317 deletions(-)
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..d6c51cc 100644
--- a/apps/amm/flake.nix
+++ b/apps/amm/flake.nix
@@ -4,17 +4,35 @@
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 = ''
+ walletQmlDir="shared-wallet/qml/Logos/Wallet"
+ if [ ! -d "$walletQmlDir" ]; then
+ echo "Built Logos.Wallet QML module not found"
+ exit 1
+ fi
+ mkdir -p "$out/lib/Logos/Wallet"
+ cp -r "$walletQmlDir/." "$out/lib/Logos/Wallet/"
+ '';
};
}
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..7b7b4af 100644
--- a/apps/amm/qml/pages/SwapPage.qml
+++ b/apps/amm/qml/pages/SwapPage.qml
@@ -1,6 +1,7 @@
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"
@@ -144,10 +145,19 @@ Item {
}
}
- SwapConfirmationDialog {
+ Component {
+ id: swapConfirmationSummary
+
+ SwapConfirmationSummary {
+ theme: theme
+ }
+ }
+
+ 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))
}