From e000e7a894da7badfde4d803fe0a975636a623c9 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Mon, 9 Feb 2026 16:08:33 -0300 Subject: [PATCH 01/36] bump logos-accounts/wallet modules --- logos-accounts-module | 2 +- logos-accounts-ui | 2 +- logos-wallet-module | 2 +- logos-wallet-ui | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/logos-accounts-module b/logos-accounts-module index 05c9680..d7c8722 160000 --- a/logos-accounts-module +++ b/logos-accounts-module @@ -1 +1 @@ -Subproject commit 05c9680a7a33b4556ed145388b59a9ab769bcd27 +Subproject commit d7c8722e6cbf50701b722db4026946d96cfadaf1 diff --git a/logos-accounts-ui b/logos-accounts-ui index ce5d0af..e5169a2 160000 --- a/logos-accounts-ui +++ b/logos-accounts-ui @@ -1 +1 @@ -Subproject commit ce5d0af6f58a8f2f8c9bfbaf0cefa1e7496c002e +Subproject commit e5169a2b79bbe06733407e9742ac732be5b5c9eb diff --git a/logos-wallet-module b/logos-wallet-module index ef98e6e..2eba6ad 160000 --- a/logos-wallet-module +++ b/logos-wallet-module @@ -1 +1 @@ -Subproject commit ef98e6ec6db9cffc819dacb45667035294af04b2 +Subproject commit 2eba6ad1933ab7d8651645dfe499c42fc01edf6c diff --git a/logos-wallet-ui b/logos-wallet-ui index 506b207..7e04dc2 160000 --- a/logos-wallet-ui +++ b/logos-wallet-ui @@ -1 +1 @@ -Subproject commit 506b2071164b202407dfc6785c3e0148d08baea1 +Subproject commit 7e04dc2988b62273b0c294c8c40b7858c34b8d61 From 3233ed2b871528200875dd586655e7002f13ae82 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Mon, 9 Feb 2026 18:32:40 -0300 Subject: [PATCH 02/36] fix path to logos-package-manager-module --- .gitmodules | 8 ++++---- README.md | 2 +- logos-package-manager | 1 - logos-package-manager-module | 1 + 4 files changed, 6 insertions(+), 6 deletions(-) delete mode 160000 logos-package-manager create mode 160000 logos-package-manager-module diff --git a/.gitmodules b/.gitmodules index f30bc59..b9ae3f7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,9 +10,9 @@ [submodule "logos-irc-module"] path = logos-irc-module url = https://github.com/logos-co/logos-irc-module -[submodule "logos-package-manager"] - path = logos-package-manager - url = https://github.com/logos-co/logos-package-manager +[submodule "logos-package-manager-module"] + path = logos-package-manager-module + url = https://github.com/logos-co/logos-package-manager-module [submodule "logos-capability-module"] path = logos-capability-module url = https://github.com/logos-co/logos-capability-module @@ -27,4 +27,4 @@ url = https://github.com/logos-co/logos-chat-ui [submodule "logos-accounts-ui"] path = logos-accounts-ui - url = https://github.com/logos-co/logos-accounts-ui + url = https://github.com/logos-co/logos-accounts-ui \ No newline at end of file diff --git a/README.md b/README.md index e6475aa..04f6894 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ to compile all modules in one go | logos-wallet-module | https://github.com/logos-co/logos-wallet-module | | logos-chat-module | https://github.com/logos-co/logos-chat-module | | logos-irc-module | https://github.com/logos-co/logos-irc-module | -| logos-package-manager | https://github.com/logos-co/logos-package-manager | +| logos-package-manager-module | https://github.com/logos-co/logos-package-manager-module | | logos-capability-module | https://github.com/logos-co/logos-capability-module | | logos-accounts-module | https://github.com/logos-co/logos-accounts-module | | logos-wallet-ui | https://github.com/logos-co/logos-wallet-ui | diff --git a/logos-package-manager b/logos-package-manager deleted file mode 160000 index cbdb3ca..0000000 --- a/logos-package-manager +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cbdb3ca8c90705e930dc63500c07bb8c10e85e90 diff --git a/logos-package-manager-module b/logos-package-manager-module new file mode 160000 index 0000000..2ad93ae --- /dev/null +++ b/logos-package-manager-module @@ -0,0 +1 @@ +Subproject commit 2ad93ae7a7fb2b924f0f2d255e9f28ddc473a2b5 From 952184ea8b7f118b398607c2c67b4fdd56fddce0 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Mon, 9 Feb 2026 16:58:02 -0300 Subject: [PATCH 03/36] introduce github action to build and publish multi os/arch packages --- .github/workflows/build-and-publish.yml | 109 ++++++++++++ .github/workflows/publish-libraries.yml | 41 ----- ci/package-modules.sh | 213 ++++++++++++++++++++++++ 3 files changed, 322 insertions(+), 41 deletions(-) create mode 100644 .github/workflows/build-and-publish.yml delete mode 100644 .github/workflows/publish-libraries.yml create mode 100755 ci/package-modules.sh diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml new file mode 100644 index 0000000..973003b --- /dev/null +++ b/.github/workflows/build-and-publish.yml @@ -0,0 +1,109 @@ +name: Build and Publish + +on: + push: + branches: [master] + +permissions: + contents: write + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-24.04 + variant: linux-amd64 + - os: ubuntu-24.04-arm + variant: linux-arm64 + - os: macos-15-intel + variant: darwin-amd64 + - os: macos-15 + variant: darwin-arm64 + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: DeterminateSystems/nix-installer-action@main + + - uses: DeterminateSystems/magic-nix-cache-action@main + + - name: Build modules + run: | + set -euo pipefail + + modules=$(git config --file .gitmodules --get-regexp path | awk '{print $2}') + mkdir -p build-output + + for module in $modules; do + echo "=== Building $module ===" + if (cd "$module" && nix build .#lib); then + echo "Built $module" + mkdir -p "build-output/${module}/lib" + cp -rL "$module/result/lib/." "build-output/${module}/lib/" + else + echo "::warning::Failed to build $module on ${{ matrix.variant }}" + fi + done + + - uses: actions/upload-artifact@v4 + with: + name: build-${{ matrix.variant }} + path: build-output/ + retention-days: 1 + + package: + needs: build + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - uses: DeterminateSystems/nix-installer-action@main + + - uses: DeterminateSystems/magic-nix-cache-action@main + + - name: Build lgx tool + run: | + nix build .#lgx + echo "LGX=$(readlink -f result/bin/lgx)" >> "$GITHUB_ENV" + + - uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Package modules + run: | + export ARTIFACTS_DIR="artifacts" + bash ci/package-modules.sh + + - name: Prepare release tag + id: tag + run: | + short_sha="${GITHUB_SHA::7}" + date_str="$(date -u +%Y%m%d)" + tag="build-${date_str}-${short_sha}" + name="Build $(date -u +%Y-%m-%d) (${short_sha})" + echo "tag=$tag" >> "$GITHUB_OUTPUT" + echo "name=$name" >> "$GITHUB_OUTPUT" + + - name: Create GitHub release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.tag.outputs.tag }} + name: ${{ steps.tag.outputs.name }} + body: "Automated build from ${{ github.sha }}" + files: | + output/*.lgx + output/list.json + draft: false + prerelease: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish-libraries.yml b/.github/workflows/publish-libraries.yml deleted file mode 100644 index 6b083ae..0000000 --- a/.github/workflows/publish-libraries.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Publish Libraries - -on: - push: - branches: [outputs] - -permissions: - contents: write - -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Gather library files - id: gather - run: | - mkdir -p upload - cp -a libraries/list.json upload/ 2>/dev/null || true - find "libraries" -maxdepth 1 -name "*.lgx" -type f -exec cp {} upload/ \; - files_count=$(find upload -maxdepth 1 -type f | wc -l) - echo "files=$files_count" >> "$GITHUB_OUTPUT" - if [ "$files_count" -eq 0 ]; then - echo "No library files found to upload" >&2 - exit 1 - fi - - - name: Publish release assets - uses: softprops/action-gh-release@v1 - with: - tag_name: outputs-libraries - name: Libraries - body: "Libraries from branch outputs. Each asset is an individual file." - files: upload/* - draft: false - prerelease: false - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/ci/package-modules.sh b/ci/package-modules.sh new file mode 100755 index 0000000..cadb486 --- /dev/null +++ b/ci/package-modules.sh @@ -0,0 +1,213 @@ +#!/usr/bin/env bash +set -euo pipefail +set -x + +# package-modules.sh — Create multi-variant .lgx packages from pre-built artifacts. +# +# Expected environment: +# LGX — path to the lgx binary +# ARTIFACTS_DIR — path to downloaded artifacts (default: "artifacts") +# +# Expected directory layout under ARTIFACTS_DIR: +# build-linux-amd64//lib/... +# build-linux-arm64//lib/... +# build-darwin-amd64//lib/... +# build-darwin-arm64//lib/... +# +# Module metadata is read from /metadata.json in the repo checkout. + +script_dir="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +repo_dir="$(cd "$script_dir/.." && pwd)" + +: "${LGX:?LGX env var must point to the lgx binary}" +: "${ARTIFACTS_DIR:=artifacts}" + +output_dir="$repo_dir/output" +mkdir -p "$output_dir" + +ALL_VARIANTS=("linux-amd64" "linux-arm64" "darwin-amd64" "darwin-arm64") + +if [[ ! -f "$repo_dir/.gitmodules" ]]; then + echo "No .gitmodules found in $repo_dir" >&2 + exit 1 +fi + +modules=$(git config --file "$repo_dir/.gitmodules" --get-regexp path | awk '{print $2}') + +if [[ -z "$modules" ]]; then + echo "No module paths found in .gitmodules" >&2 + exit 1 +fi + +# Store module metadata for list.json generation +module_entries=() + +for module in $modules; do + echo "=== Processing $module ===" + + # Check which variants have build output for this module + available_variants=() + for variant in "${ALL_VARIANTS[@]}"; do + variant_lib_dir="$ARTIFACTS_DIR/build-${variant}/${module}/lib" + if [[ -d "$variant_lib_dir" ]] && [[ -n "$(ls -A "$variant_lib_dir" 2>/dev/null)" ]]; then + available_variants+=("$variant") + fi + done + + if [[ ${#available_variants[@]} -eq 0 ]]; then + echo "No build output found for $module in any variant, skipping." + continue + fi + + echo "Available variants for $module: ${available_variants[*]}" + + # Read metadata + module_metadata_path="$repo_dir/$module/metadata.json" + module_metadata_json=$(python3 - "$module_metadata_path" <<'PY' +import json +import sys + +try: + with open(sys.argv[1], "r") as f: + metadata = json.load(f) + result = { + "type": metadata.get("type", ""), + "name": metadata.get("name", ""), + "description": metadata.get("description", ""), + "dependencies": metadata.get("dependencies", []), + "category": metadata.get("category", ""), + "author": metadata.get("author", ""), + "version": metadata.get("version", "0.0.1"), + "main": metadata.get("main", "") + } + print(json.dumps(result)) +except (FileNotFoundError, json.JSONDecodeError, KeyError): + print(json.dumps({ + "type": "", + "name": "", + "description": "", + "dependencies": [], + "category": "", + "author": "", + "version": "0.0.1", + "main": "" + })) +PY +) + module_metadata_json=${module_metadata_json//$'\n'/} + + package_name=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('name', ''))") + + if [[ -z "$package_name" ]]; then + echo "No package name found in metadata.json for $module, skipping." >&2 + continue + fi + + lgx_package_path="$output_dir/${package_name}.lgx" + + # Create a fresh LGX package + echo "Creating new LGX package: ${package_name}.lgx" + rm -f "${package_name}.lgx" + + "$LGX" create "$package_name" || { + echo "Failed to create LGX package for $package_name" >&2 + exit 1 + } + + mv "${package_name}.lgx" "$lgx_package_path" + + # Get main entry from metadata + main_entry=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('main', ''))") + + # Add each available variant + for variant in "${available_variants[@]}"; do + variant_lib_dir="$ARTIFACTS_DIR/build-${variant}/${module}/lib" + + if [[ -n "$main_entry" ]]; then + # Determine extension based on variant platform + case "$variant" in + darwin-*) lib_ext=".dylib" ;; + linux-*) lib_ext=".so" ;; + esac + main_path="${main_entry}${lib_ext}" + else + # Fallback: use first file in library directory + main_file=$(ls "$variant_lib_dir" | head -n 1) + if [[ -z "$main_file" ]]; then + echo "No library files found in $variant_lib_dir" >&2 + exit 1 + fi + main_path="$main_file" + fi + + echo "Adding variant $variant to ${package_name}.lgx" + "$LGX" add "$lgx_package_path" \ + --variant "$variant" \ + --files "$variant_lib_dir/." \ + --main "$main_path" \ + -y || { + echo "Failed to add variant $variant to LGX package for $package_name" >&2 + exit 1 + } + + echo "Successfully added variant $variant to ${package_name}.lgx" + done + + # Store entry for list.json generation + module_entries+=("$module::$module_metadata_json::${package_name}.lgx") +done + +# Generate list.json +list_json_path="$output_dir/list.json" + +python3 - "$list_json_path" "${module_entries[@]}" <<'PY' +import json +import os +import sys + +list_path = sys.argv[1] +entries = sys.argv[2:] + +result_index = {} + +for raw in entries: + if "::" not in raw: + continue + parts = raw.split("::", 2) + if len(parts) != 3: + continue + + name, metadata_json, package_filename = parts + try: + metadata = json.loads(metadata_json) + except json.JSONDecodeError: + metadata = {} + + item = {"name": name} + item["package"] = package_filename + + if "type" in metadata: + item["type"] = metadata["type"] + if "name" in metadata: + item["moduleName"] = metadata["name"] + if "description" in metadata: + item["description"] = metadata["description"] + if "dependencies" in metadata: + item["dependencies"] = metadata["dependencies"] + if "category" in metadata: + item["category"] = metadata["category"] + if "author" in metadata: + item["author"] = metadata["author"] + + result_index[name] = item + +result = [result_index[k] for k in sorted(result_index)] +os.makedirs(os.path.dirname(list_path), exist_ok=True) +with open(list_path, "w") as f: + json.dump(result, f, indent=2) +PY + +echo "" +echo "All modules packaged successfully." +echo "LGX packages created in $output_dir" +echo "Package list written to $list_json_path" From b049630f761f7b0de639ede0acbaf652ee1f0199 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 10 Feb 2026 17:53:52 -0300 Subject: [PATCH 04/36] bump logos-package-manager-module --- logos-package-manager-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-package-manager-module b/logos-package-manager-module index 2ad93ae..0cbf250 160000 --- a/logos-package-manager-module +++ b/logos-package-manager-module @@ -1 +1 @@ -Subproject commit 2ad93ae7a7fb2b924f0f2d255e9f28ddc473a2b5 +Subproject commit 0cbf250ad2fec20c79dc5f61729a07c3a2bd50e1 From e110d09c48182a42ad0655afd5861db7db2d9c3c Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 10 Feb 2026 22:50:59 -0300 Subject: [PATCH 05/36] bump logos-wallet-ui and logos-accounts-ui --- logos-accounts-ui | 2 +- logos-wallet-ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/logos-accounts-ui b/logos-accounts-ui index e5169a2..515e379 160000 --- a/logos-accounts-ui +++ b/logos-accounts-ui @@ -1 +1 @@ -Subproject commit e5169a2b79bbe06733407e9742ac732be5b5c9eb +Subproject commit 515e379d16e2115eed7da21c03ba523ec8e2007c diff --git a/logos-wallet-ui b/logos-wallet-ui index 7e04dc2..d260e57 160000 --- a/logos-wallet-ui +++ b/logos-wallet-ui @@ -1 +1 @@ -Subproject commit 7e04dc2988b62273b0c294c8c40b7858c34b8d61 +Subproject commit d260e57e849aa15cb6bcf6fccb5584cc1604a562 From c81c66e918399cd8622c3d2f74848554279001e7 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Thu, 12 Feb 2026 18:54:00 -0300 Subject: [PATCH 06/36] add blockchain modules --- .gitmodules | 8 +++++++- README.md | 2 ++ logos-blockchain-module | 1 + logos-execution-zone-module | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) create mode 160000 logos-blockchain-module create mode 160000 logos-execution-zone-module diff --git a/.gitmodules b/.gitmodules index b9ae3f7..f6ec865 100644 --- a/.gitmodules +++ b/.gitmodules @@ -27,4 +27,10 @@ url = https://github.com/logos-co/logos-chat-ui [submodule "logos-accounts-ui"] path = logos-accounts-ui - url = https://github.com/logos-co/logos-accounts-ui \ No newline at end of file + url = https://github.com/logos-co/logos-accounts-ui +[submodule "logos-blockchain-module"] + path = logos-blockchain-module + url = https://github.com/logos-blockchain/logos-blockchain-module +[submodule "logos-execution-zone-module"] + path = logos-execution-zone-module + url = https://github.com/logos-blockchain/logos-execution-zone-module diff --git a/README.md b/README.md index 04f6894..9494da6 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ to compile all modules in one go | logos-wallet-ui | https://github.com/logos-co/logos-wallet-ui | | logos-chat-ui | https://github.com/logos-co/logos-chat-ui | | logos-accounts-ui | https://github.com/logos-co/logos-accounts-ui | +| logos-blockchain | https://github.com/logos-blockchain/logos-blockchain-module | +| logos-execution-zone | https://github.com/logos-blockchain/logos-execution-zone-module | ## Requirements diff --git a/logos-blockchain-module b/logos-blockchain-module new file mode 160000 index 0000000..4be5332 --- /dev/null +++ b/logos-blockchain-module @@ -0,0 +1 @@ +Subproject commit 4be5332d2602c1250c6ce408793bbcbda33054fd diff --git a/logos-execution-zone-module b/logos-execution-zone-module new file mode 160000 index 0000000..15d2e1b --- /dev/null +++ b/logos-execution-zone-module @@ -0,0 +1 @@ +Subproject commit 15d2e1bc9adc1685770e00085584c61c30fc5847 From 7555be6a33769501fbcc7f7845aebcef10e4d4ad Mon Sep 17 00:00:00 2001 From: danielSanchezQ <3danimanimal@gmail.com> Date: Fri, 13 Feb 2026 11:18:19 +0000 Subject: [PATCH 07/36] Update flakes --- logos-blockchain-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-blockchain-module b/logos-blockchain-module index 4be5332..cbab769 160000 --- a/logos-blockchain-module +++ b/logos-blockchain-module @@ -1 +1 @@ -Subproject commit 4be5332d2602c1250c6ce408793bbcbda33054fd +Subproject commit cbab7696d40431b7fbacbf03ec044adc28ac86b0 From 036e7bd97a55618944feb23d822d2a19e04e4529 Mon Sep 17 00:00:00 2001 From: Khushboo Mehta Date: Fri, 13 Feb 2026 18:44:48 +0100 Subject: [PATCH 08/36] Add logos-blockchain-ui submodule Add the Blockchain UI plugin as a submodule, pointing to https://github.com/logos-blockchain/logos-blockchain-ui. Co-authored-by: Cursor --- .gitmodules | 3 +++ README.md | 1 + logos-blockchain-ui | 1 + 3 files changed, 5 insertions(+) create mode 160000 logos-blockchain-ui diff --git a/.gitmodules b/.gitmodules index f6ec865..6043cb5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -34,3 +34,6 @@ [submodule "logos-execution-zone-module"] path = logos-execution-zone-module url = https://github.com/logos-blockchain/logos-execution-zone-module +[submodule "logos-blockchain-ui"] + path = logos-blockchain-ui + url = https://github.com/logos-blockchain/logos-blockchain-ui diff --git a/README.md b/README.md index 9494da6..6c6bb9e 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ to compile all modules in one go | logos-accounts-ui | https://github.com/logos-co/logos-accounts-ui | | logos-blockchain | https://github.com/logos-blockchain/logos-blockchain-module | | logos-execution-zone | https://github.com/logos-blockchain/logos-execution-zone-module | +| logos-blockchain-ui | https://github.com/logos-blockchain/logos-blockchain-ui | ## Requirements diff --git a/logos-blockchain-ui b/logos-blockchain-ui new file mode 160000 index 0000000..da055ad --- /dev/null +++ b/logos-blockchain-ui @@ -0,0 +1 @@ +Subproject commit da055ad72ed45c916057af04208dd4ea7b8ddc83 From 88bb746ee564dbab3ff479e3fbca55087431b82e Mon Sep 17 00:00:00 2001 From: danielSanchezQ <3danimanimal@gmail.com> Date: Mon, 16 Feb 2026 10:10:32 +0000 Subject: [PATCH 09/36] Update blockchain module --- logos-blockchain-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-blockchain-module b/logos-blockchain-module index cbab769..4e57037 160000 --- a/logos-blockchain-module +++ b/logos-blockchain-module @@ -1 +1 @@ -Subproject commit cbab7696d40431b7fbacbf03ec044adc28ac86b0 +Subproject commit 4e5703787ea3bc1af23c446e95940a804dfe4bf4 From 71254293b8b6a136bef10b6847c15d3258a0bc5f Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 08:31:39 -0300 Subject: [PATCH 10/36] make modules portable before packaging --- .github/workflows/build-and-publish.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 973003b..3573669 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -42,10 +42,10 @@ jobs: for module in $modules; do echo "=== Building $module ===" - if (cd "$module" && nix build .#lib); then + if (cd "$module" && nix bundle --bundler github:logos-co/nix-bundle-dir#permissive -o result .#lib); then echo "Built $module" - mkdir -p "build-output/${module}/lib" - cp -rL "$module/result/lib/." "build-output/${module}/lib/" + mkdir -p "build-output/${module}" + cp -rL "$module/result/." "build-output/${module}/" else echo "::warning::Failed to build $module on ${{ matrix.variant }}" fi From f138cdeaf0071d24137670c8f55f9cc0c19c857d Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 09:04:36 -0300 Subject: [PATCH 11/36] general improvements --- .github/workflows/build-and-publish.yml | 39 ++++++++++++++++++++++++- ci/package-modules.sh | 17 +++++++---- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 3573669..cd3323b 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -84,6 +84,38 @@ jobs: export ARTIFACTS_DIR="artifacts" bash ci/package-modules.sh + - name: Generate release table + id: table + run: | + python3 - <<'PY' >> "$GITHUB_OUTPUT" + import json + + with open("output/list.json") as f: + modules = json.load(f) + + all_variants = ["linux-amd64", "linux-arm64", "darwin-amd64", "darwin-arm64"] + header = "| Module | " + " | ".join(all_variants) + " |" + sep = "|--------|" + "|".join([":---:" for _ in all_variants]) + "|" + + rows = [] + for m in modules: + name = m.get("moduleName", m.get("name", "")) + version = m.get("version", "") + label = f"{name} v{version}" if version else name + variants = set(m.get("variants", [])) + cells = " | ".join("\u2705" if v in variants else "\u274c" for v in all_variants) + rows.append(f"| {label} | {cells} |") + + table = "\n".join([header, sep] + rows) + + # Use multiline output + import os + delim = "EOF_TABLE" + print(f"table<<{delim}") + print(table) + print(delim) + PY + - name: Prepare release tag id: tag run: | @@ -99,7 +131,12 @@ jobs: with: tag_name: ${{ steps.tag.outputs.tag }} name: ${{ steps.tag.outputs.name }} - body: "Automated build from ${{ github.sha }}" + body: | + Automated build from ${{ github.sha }} + + ## Module Availability + + ${{ steps.table.outputs.table }} files: | output/*.lgx output/list.json diff --git a/ci/package-modules.sh b/ci/package-modules.sh index cadb486..8aa6ef8 100755 --- a/ci/package-modules.sh +++ b/ci/package-modules.sh @@ -153,8 +153,9 @@ PY echo "Successfully added variant $variant to ${package_name}.lgx" done - # Store entry for list.json generation - module_entries+=("$module::$module_metadata_json::${package_name}.lgx") + # Store entry for list.json generation (variants as comma-separated list) + variants_csv=$(IFS=,; echo "${available_variants[*]}") + module_entries+=("$module::$module_metadata_json::${package_name}.lgx::${variants_csv}") done # Generate list.json @@ -173,11 +174,13 @@ result_index = {} for raw in entries: if "::" not in raw: continue - parts = raw.split("::", 2) - if len(parts) != 3: + parts = raw.split("::", 3) + if len(parts) < 3: continue - name, metadata_json, package_filename = parts + name, metadata_json, package_filename = parts[0], parts[1], parts[2] + variants_csv = parts[3] if len(parts) > 3 else "" + try: metadata = json.loads(metadata_json) except json.JSONDecodeError: @@ -198,6 +201,10 @@ for raw in entries: item["category"] = metadata["category"] if "author" in metadata: item["author"] = metadata["author"] + if metadata.get("version"): + item["version"] = metadata["version"] + if variants_csv: + item["variants"] = [v for v in variants_csv.split(",") if v] result_index[name] = item From ba63f7e11aa16ed2a6abb9fab7b228b7fa8f3847 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 09:46:31 -0300 Subject: [PATCH 12/36] disable macOS intel builds --- .github/workflows/build-and-publish.yml | 2 -- ci/package-modules.sh | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index cd3323b..4ad9e1c 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -17,8 +17,6 @@ jobs: variant: linux-amd64 - os: ubuntu-24.04-arm variant: linux-arm64 - - os: macos-15-intel - variant: darwin-amd64 - os: macos-15 variant: darwin-arm64 diff --git a/ci/package-modules.sh b/ci/package-modules.sh index 8aa6ef8..9522f31 100755 --- a/ci/package-modules.sh +++ b/ci/package-modules.sh @@ -11,7 +11,6 @@ set -x # Expected directory layout under ARTIFACTS_DIR: # build-linux-amd64//lib/... # build-linux-arm64//lib/... -# build-darwin-amd64//lib/... # build-darwin-arm64//lib/... # # Module metadata is read from /metadata.json in the repo checkout. @@ -25,7 +24,7 @@ repo_dir="$(cd "$script_dir/.." && pwd)" output_dir="$repo_dir/output" mkdir -p "$output_dir" -ALL_VARIANTS=("linux-amd64" "linux-arm64" "darwin-amd64" "darwin-arm64") +ALL_VARIANTS=("linux-amd64" "linux-arm64" "darwin-arm64") if [[ ! -f "$repo_dir/.gitmodules" ]]; then echo "No .gitmodules found in $repo_dir" >&2 From 06c12aa5a2e2017b1575ef1c1c2d0213c4b014a0 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 10:12:43 -0300 Subject: [PATCH 13/36] parallel builds --- .github/workflows/build-and-publish.yml | 61 +++++++++++++++---------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 4ad9e1c..026a25f 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -8,19 +8,35 @@ permissions: contents: write jobs: + discover: + runs-on: ubuntu-latest + outputs: + modules: ${{ steps.modules.outputs.modules }} + steps: + - uses: actions/checkout@v4 + + - name: List modules + id: modules + run: | + modules=$(git config --file .gitmodules --get-regexp path | awk '{print $2}' | jq -R -s -c 'split("\n") | map(select(length > 0))') + echo "modules=$modules" >> "$GITHUB_OUTPUT" + build: + needs: discover strategy: fail-fast: false matrix: - include: + variant: - os: ubuntu-24.04 - variant: linux-amd64 + name: linux-amd64 - os: ubuntu-24.04-arm - variant: linux-arm64 + name: linux-arm64 - os: macos-15 - variant: darwin-arm64 + name: darwin-arm64 + module: ${{ fromJson(needs.discover.outputs.modules) }} - runs-on: ${{ matrix.os }} + runs-on: ${{ matrix.variant.os }} + continue-on-error: true steps: - uses: actions/checkout@v4 @@ -31,32 +47,28 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - - name: Build modules + - name: Build ${{ matrix.module }} + id: build run: | - set -euo pipefail + cd "${{ matrix.module }}" + nix bundle --bundler github:logos-co/nix-bundle-dir#permissive -o result .#lib - modules=$(git config --file .gitmodules --get-regexp path | awk '{print $2}') - mkdir -p build-output - - for module in $modules; do - echo "=== Building $module ===" - if (cd "$module" && nix bundle --bundler github:logos-co/nix-bundle-dir#permissive -o result .#lib); then - echo "Built $module" - mkdir -p "build-output/${module}" - cp -rL "$module/result/." "build-output/${module}/" - else - echo "::warning::Failed to build $module on ${{ matrix.variant }}" - fi - done + - name: Collect output + if: steps.build.outcome == 'success' + run: | + mkdir -p "build-output/build-${{ matrix.variant.name }}/${{ matrix.module }}" + cp -rL "${{ matrix.module }}/result/." "build-output/build-${{ matrix.variant.name }}/${{ matrix.module }}/" - uses: actions/upload-artifact@v4 + if: steps.build.outcome == 'success' with: - name: build-${{ matrix.variant }} + name: build-${{ matrix.variant.name }}--${{ matrix.module }} path: build-output/ retention-days: 1 package: - needs: build + needs: [discover, build] + if: always() runs-on: ubuntu-latest steps: @@ -76,6 +88,8 @@ jobs: - uses: actions/download-artifact@v4 with: path: artifacts + pattern: build-* + merge-multiple: true - name: Package modules run: | @@ -91,7 +105,7 @@ jobs: with open("output/list.json") as f: modules = json.load(f) - all_variants = ["linux-amd64", "linux-arm64", "darwin-amd64", "darwin-arm64"] + all_variants = ["linux-amd64", "linux-arm64", "darwin-arm64"] header = "| Module | " + " | ".join(all_variants) + " |" sep = "|--------|" + "|".join([":---:" for _ in all_variants]) + "|" @@ -106,7 +120,6 @@ jobs: table = "\n".join([header, sep] + rows) - # Use multiline output import os delim = "EOF_TABLE" print(f"table<<{delim}") From cc4d9cd4b6f3e1121ec653ca185839bd1a571a8f Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 12:13:21 -0300 Subject: [PATCH 14/36] fetch only first level of submodules for package stage --- .github/workflows/build-and-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 026a25f..226db21 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -74,7 +74,7 @@ jobs: steps: - uses: actions/checkout@v4 with: - submodules: recursive + submodules: true - uses: DeterminateSystems/nix-installer-action@main From fa61f1518e9639502599361eaf1bdfdac6ebcae8 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Wed, 11 Feb 2026 13:36:57 +0400 Subject: [PATCH 15/36] Add Storage module --- .gitmodules | 3 +++ logos-storage-module | 1 + 2 files changed, 4 insertions(+) create mode 160000 logos-storage-module diff --git a/.gitmodules b/.gitmodules index 6043cb5..9ce6b0c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,3 +37,6 @@ [submodule "logos-blockchain-ui"] path = logos-blockchain-ui url = https://github.com/logos-blockchain/logos-blockchain-ui +[submodule "logos-storage-module"] + path = logos-storage-module + url = https://github.com/logos-co/logos-storage-module diff --git a/logos-storage-module b/logos-storage-module new file mode 160000 index 0000000..93c832f --- /dev/null +++ b/logos-storage-module @@ -0,0 +1 @@ +Subproject commit 93c832f981e9e319ea3062e30107b037b965c7ab From e6a20c6a68a97751391bcbb2c66483bb20945dc8 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Wed, 11 Feb 2026 13:38:18 +0400 Subject: [PATCH 16/36] Add logos storage to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6c6bb9e..087c900 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ to compile all modules in one go | logos-blockchain | https://github.com/logos-blockchain/logos-blockchain-module | | logos-execution-zone | https://github.com/logos-blockchain/logos-execution-zone-module | | logos-blockchain-ui | https://github.com/logos-blockchain/logos-blockchain-ui | +| logos-storage-module | https://github.com/logos-co/logos-storage-module | ## Requirements From 9f71dc3c4523829402664ab3ae51357cea4b5227 Mon Sep 17 00:00:00 2001 From: Arnaud Date: Tue, 17 Feb 2026 21:08:02 +0400 Subject: [PATCH 17/36] Update storage module --- logos-storage-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-storage-module b/logos-storage-module index 93c832f..b4ecf7a 160000 --- a/logos-storage-module +++ b/logos-storage-module @@ -1 +1 @@ -Subproject commit 93c832f981e9e319ea3062e30107b037b965c7ab +Subproject commit b4ecf7a871233608f63b817eeae426f6273695d9 From 7580c1c2ad7e7d26971dba42fad1ee2f2a0b2eb9 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 16:30:10 -0300 Subject: [PATCH 18/36] fix package manifest generation --- .github/workflows/build-and-publish.yml | 10 ++-- ci/package-modules.sh | 41 +++++++++++++++ compile.sh | 66 +++++++++++-------------- 3 files changed, 76 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 226db21..85dba95 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -13,7 +13,7 @@ jobs: outputs: modules: ${{ steps.modules.outputs.modules }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: List modules id: modules @@ -39,7 +39,7 @@ jobs: continue-on-error: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: recursive @@ -59,7 +59,7 @@ jobs: mkdir -p "build-output/build-${{ matrix.variant.name }}/${{ matrix.module }}" cp -rL "${{ matrix.module }}/result/." "build-output/build-${{ matrix.variant.name }}/${{ matrix.module }}/" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v6 if: steps.build.outcome == 'success' with: name: build-${{ matrix.variant.name }}--${{ matrix.module }} @@ -72,7 +72,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: true @@ -85,7 +85,7 @@ jobs: nix build .#lgx echo "LGX=$(readlink -f result/bin/lgx)" >> "$GITHUB_ENV" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v7 with: path: artifacts pattern: build-* diff --git a/ci/package-modules.sh b/ci/package-modules.sh index 9522f31..1804492 100755 --- a/ci/package-modules.sh +++ b/ci/package-modules.sh @@ -115,6 +115,47 @@ PY mv "${package_name}.lgx" "$lgx_package_path" + # Patch manifest.json inside the LGX package with module metadata + echo "Updating package manifest with metadata..." + python3 - "$lgx_package_path" "$module_metadata_json" <<'PY' +import json +import sys +import tarfile +import io + +lgx_path = sys.argv[1] +metadata = json.loads(sys.argv[2]) + +# Read all members from the original archive +with tarfile.open(lgx_path, 'r:gz') as tar: + members = [] + for member in tar.getmembers(): + if member.isfile(): + members.append((member, tar.extractfile(member).read())) + else: + members.append((member, None)) + +# Patch the manifest content +patched = [] +for member, data in members: + if member.name == 'manifest.json': + manifest = json.loads(data) + for key in ('name', 'version', 'description', 'author', 'type', 'category', 'dependencies'): + if metadata.get(key): + manifest[key] = metadata[key] + data = json.dumps(manifest, indent=2).encode() + member.size = len(data) + patched.append((member, data)) + +# Rewrite the archive preserving original member metadata +with tarfile.open(lgx_path, 'w:gz', format=tarfile.GNU_FORMAT) as tar: + for member, data in patched: + if data is not None: + tar.addfile(member, io.BytesIO(data)) + else: + tar.addfile(member) +PY + # Get main entry from metadata main_entry=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('main', ''))") diff --git a/compile.sh b/compile.sh index 94a0d8d..01981a0 100755 --- a/compile.sh +++ b/compile.sh @@ -149,45 +149,39 @@ PY import json import sys import tarfile -import gzip -import tempfile -import os -import shutil +import io lgx_path = sys.argv[1] -metadata_json = sys.argv[2] -metadata = json.loads(metadata_json) +metadata = json.loads(sys.argv[2]) -# Extract to temp directory -temp_dir = tempfile.mkdtemp() -try: - # Extract existing package - with tarfile.open(lgx_path, 'r:gz') as tar: - tar.extractall(temp_dir) - - # Read and update manifest - manifest_path = os.path.join(temp_dir, 'manifest.json') - with open(manifest_path, 'r') as f: - manifest = json.load(f) - - # Update manifest fields from metadata - manifest['name'] = metadata.get('name', manifest['name']) - manifest['version'] = metadata.get('version', manifest['version']) - manifest['description'] = metadata.get('description', manifest['description']) - manifest['author'] = metadata.get('author', manifest['author']) - manifest['type'] = metadata.get('type', manifest['type']) - manifest['category'] = metadata.get('category', manifest['category']) - manifest['dependencies'] = metadata.get('dependencies', manifest['dependencies']) - - # Write updated manifest - with open(manifest_path, 'w') as f: - json.dump(manifest, f, indent=2) - - # Recreate the package - use lgx CLI for proper deterministic packing - # For now, we'll trust that lgx add will update it properly when we add variants - -finally: - shutil.rmtree(temp_dir, ignore_errors=True) +# Read all members from the original archive +with tarfile.open(lgx_path, 'r:gz') as tar: + members = [] + for member in tar.getmembers(): + if member.isfile(): + members.append((member, tar.extractfile(member).read())) + else: + members.append((member, None)) + +# Patch the manifest content +patched = [] +for member, data in members: + if member.name == 'manifest.json': + manifest = json.loads(data) + for key in ('name', 'version', 'description', 'author', 'type', 'category', 'dependencies'): + if metadata.get(key): + manifest[key] = metadata[key] + data = json.dumps(manifest, indent=2).encode() + member.size = len(data) + patched.append((member, data)) + +# Rewrite the archive preserving original member metadata +with tarfile.open(lgx_path, 'w:gz', format=tarfile.GNU_FORMAT) as tar: + for member, data in patched: + if data is not None: + tar.addfile(member, io.BytesIO(data)) + else: + tar.addfile(member) PY fi From dc6ca779c305834c9ee9ead7427499f16041762b Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 17 Feb 2026 18:53:36 -0300 Subject: [PATCH 19/36] make build and publish job manually run, with options --- .github/workflows/build-and-publish.yml | 33 ++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 85dba95..f2ffe10 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -1,8 +1,16 @@ name: Build and Publish on: - push: - branches: [master] + workflow_dispatch: + inputs: + include: + description: 'Comma-separated list of modules to build (leave empty to build all)' + required: false + default: '' + exclude: + description: 'Comma-separated list of modules to exclude from build' + required: false + default: '' permissions: contents: write @@ -18,7 +26,24 @@ jobs: - name: List modules id: modules run: | - modules=$(git config --file .gitmodules --get-regexp path | awk '{print $2}' | jq -R -s -c 'split("\n") | map(select(length > 0))') + all_modules=$(git config --file .gitmodules --get-regexp path | awk '{print $2}' | jq -R -s -c 'split("\n") | map(select(length > 0))') + + include_input="${{ inputs.include }}" + exclude_input="${{ inputs.exclude }}" + + if [[ -n "$include_input" ]]; then + # Filter to only included modules + include_json=$(echo "$include_input" | tr ',' '\n' | sed 's/^ *//;s/ *$//' | jq -R -s -c 'split("\n") | map(select(length > 0))') + modules=$(echo "$all_modules" | jq -c --argjson inc "$include_json" '[.[] | select(. as $m | $inc | any(. == $m))]') + elif [[ -n "$exclude_input" ]]; then + # Filter out excluded modules + exclude_json=$(echo "$exclude_input" | tr ',' '\n' | sed 's/^ *//;s/ *$//' | jq -R -s -c 'split("\n") | map(select(length > 0))') + modules=$(echo "$all_modules" | jq -c --argjson exc "$exclude_json" '[.[] | select(. as $m | $exc | any(. == $m) | not)]') + else + modules="$all_modules" + fi + + echo "Building modules: $modules" echo "modules=$modules" >> "$GITHUB_OUTPUT" build: @@ -138,7 +163,7 @@ jobs: echo "name=$name" >> "$GITHUB_OUTPUT" - name: Create GitHub release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.tag.outputs.tag }} name: ${{ steps.tag.outputs.name }} From bead5f632004c8ca51a70891adb95c16e45d1bcf Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Thu, 19 Feb 2026 05:14:32 -0300 Subject: [PATCH 20/36] bundle modules as qt plugins --- .github/workflows/build-and-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index f2ffe10..1fb4890 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -76,7 +76,7 @@ jobs: id: build run: | cd "${{ matrix.module }}" - nix bundle --bundler github:logos-co/nix-bundle-dir#permissive -o result .#lib + nix bundle --bundler github:logos-co/nix-bundle-dir#qtPlugin -o result .#lib - name: Collect output if: steps.build.outcome == 'success' From 03f0631a80ede250dd065cf58ba22b646738ca29 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Thu, 19 Feb 2026 11:24:27 -0300 Subject: [PATCH 21/36] unique identifier for releases --- .github/workflows/build-and-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 1fb4890..a311a72 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -157,8 +157,8 @@ jobs: run: | short_sha="${GITHUB_SHA::7}" date_str="$(date -u +%Y%m%d)" - tag="build-${date_str}-${short_sha}" - name="Build $(date -u +%Y-%m-%d) (${short_sha})" + tag="build-${date_str}-${short_sha}-${GITHUB_RUN_NUMBER}" + name="Build $(date -u +%Y-%m-%d) (${short_sha}) #${GITHUB_RUN_NUMBER}" echo "tag=$tag" >> "$GITHUB_OUTPUT" echo "name=$name" >> "$GITHUB_OUTPUT" From 9f6bfb498dc6013352ca7c40770b689ddd8a78fd Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Thu, 19 Feb 2026 11:26:21 -0300 Subject: [PATCH 22/36] skip release if build job run on a branch other than master --- .github/workflows/build-and-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index a311a72..18aa076 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -163,6 +163,7 @@ jobs: echo "name=$name" >> "$GITHUB_OUTPUT" - name: Create GitHub release + if: github.ref == 'refs/heads/master' uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.tag.outputs.tag }} From 281478c4f94624bd289e5e10b06673202d14e459 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Thu, 19 Feb 2026 11:30:21 -0300 Subject: [PATCH 23/36] release description improvements --- .github/workflows/build-and-publish.yml | 83 ++++++++++++++++--------- 1 file changed, 52 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 18aa076..8c76494 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -121,37 +121,6 @@ jobs: export ARTIFACTS_DIR="artifacts" bash ci/package-modules.sh - - name: Generate release table - id: table - run: | - python3 - <<'PY' >> "$GITHUB_OUTPUT" - import json - - with open("output/list.json") as f: - modules = json.load(f) - - all_variants = ["linux-amd64", "linux-arm64", "darwin-arm64"] - header = "| Module | " + " | ".join(all_variants) + " |" - sep = "|--------|" + "|".join([":---:" for _ in all_variants]) + "|" - - rows = [] - for m in modules: - name = m.get("moduleName", m.get("name", "")) - version = m.get("version", "") - label = f"{name} v{version}" if version else name - variants = set(m.get("variants", [])) - cells = " | ".join("\u2705" if v in variants else "\u274c" for v in all_variants) - rows.append(f"| {label} | {cells} |") - - table = "\n".join([header, sep] + rows) - - import os - delim = "EOF_TABLE" - print(f"table<<{delim}") - print(table) - print(delim) - PY - - name: Prepare release tag id: tag run: | @@ -162,6 +131,56 @@ jobs: echo "tag=$tag" >> "$GITHUB_OUTPUT" echo "name=$name" >> "$GITHUB_OUTPUT" + include="${{ inputs.include }}" + exclude="${{ inputs.exclude }}" + if [[ -n "$include" ]]; then + config="Modules: \`${include}\`" + elif [[ -n "$exclude" ]]; then + config="Modules: all (excluding: \`${exclude}\`)" + else + config="Modules: all" + fi + echo "config=$config" >> "$GITHUB_OUTPUT" + + - name: Generate release table + id: table + env: + RELEASE_TAG: ${{ steps.tag.outputs.tag }} + run: | + python3 - <<'PY' >> "$GITHUB_OUTPUT" + import json, os + + with open("output/list.json") as f: + modules = json.load(f) + + repo = os.environ.get("GITHUB_REPOSITORY", "") + tag = os.environ.get("RELEASE_TAG", "") + + all_variants = ["linux-amd64", "linux-arm64", "darwin-arm64"] + header = "| Module | " + " | ".join(all_variants) + " |" + sep = "|--------|" + "|".join([":---:" for _ in all_variants]) + "|" + + rows = [] + for m in modules: + name = m.get("moduleName", m.get("name", "")) + version = m.get("version", "") + label = f"{name} v{version}" if version else name + package = m.get("package", "") + if repo and tag and package: + url = f"https://github.com/{repo}/releases/download/{tag}/{package}" + label = f"[{label}]({url})" + variants = set(m.get("variants", [])) + cells = " | ".join("\u2705" if v in variants else "\u274c" for v in all_variants) + rows.append(f"| {label} | {cells} |") + + table = "\n".join([header, sep] + rows) + + delim = "EOF_TABLE" + print(f"table<<{delim}") + print(table) + print(delim) + PY + - name: Create GitHub release if: github.ref == 'refs/heads/master' uses: softprops/action-gh-release@v2 @@ -171,6 +190,8 @@ jobs: body: | Automated build from ${{ github.sha }} + ${{ steps.tag.outputs.config }} + ## Module Availability ${{ steps.table.outputs.table }} From 4bbfde52c00240a136ad48d9d5742f47b4dde28c Mon Sep 17 00:00:00 2001 From: Ivan Folgueira Bande Date: Fri, 20 Feb 2026 00:39:15 +0100 Subject: [PATCH 24/36] bump logos-waku-module --- logos-waku-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-waku-module b/logos-waku-module index 0e01fb8..5122c0a 160000 --- a/logos-waku-module +++ b/logos-waku-module @@ -1 +1 @@ -Subproject commit 0e01fb8676814dc74f5c2bb399c1c0710e73d449 +Subproject commit 5122c0a51d123f6b06e163ab3009535ec8a1cb96 From d87666d564f230cc3b9f9dc8ddbc0c215602b356 Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:23:01 +0100 Subject: [PATCH 25/36] Bump logos-waku-module to latest (a38b428) - includes libpq --- logos-waku-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-waku-module b/logos-waku-module index 5122c0a..a38b428 160000 --- a/logos-waku-module +++ b/logos-waku-module @@ -1 +1 @@ -Subproject commit 5122c0a51d123f6b06e163ab3009535ec8a1cb96 +Subproject commit a38b428d52dcd67a70a3f553055227d6b1c86681 From c832eee7e4089b6f5b8357eaf2fc8dc90f6f4c43 Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:33:05 +0100 Subject: [PATCH 26/36] Add logos-delivery-module submodule --- .gitmodules | 3 +++ logos-delivery-module | 1 + 2 files changed, 4 insertions(+) create mode 160000 logos-delivery-module diff --git a/.gitmodules b/.gitmodules index 9ce6b0c..82773fb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -40,3 +40,6 @@ [submodule "logos-storage-module"] path = logos-storage-module url = https://github.com/logos-co/logos-storage-module +[submodule "logos-delivery-module"] + path = logos-delivery-module + url = https://github.com/logos-co/logos-delivery-module.git diff --git a/logos-delivery-module b/logos-delivery-module new file mode 160000 index 0000000..bceeea1 --- /dev/null +++ b/logos-delivery-module @@ -0,0 +1 @@ +Subproject commit bceeea1fbb19a7e3d30adf83f65924a9428bd055 From 2683cbc9ee451698f65552e7daa56d25ca276bef Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Fri, 20 Feb 2026 14:44:36 +0100 Subject: [PATCH 27/36] Add logos-delivery-module in README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 087c900..d72ee69 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ to compile all modules in one go | logos-execution-zone | https://github.com/logos-blockchain/logos-execution-zone-module | | logos-blockchain-ui | https://github.com/logos-blockchain/logos-blockchain-ui | | logos-storage-module | https://github.com/logos-co/logos-storage-module | +| logos-delivery-module | https://github.com/logos-co/logos-delivery-module | ## Requirements From 7dedd913bec7e85647514efe598921ba1f535b83 Mon Sep 17 00:00:00 2001 From: Ivan Folgueira Bande Date: Sat, 21 Feb 2026 00:11:33 +0100 Subject: [PATCH 28/36] bump logos-waku-module --- logos-waku-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-waku-module b/logos-waku-module index a38b428..b4bd68f 160000 --- a/logos-waku-module +++ b/logos-waku-module @@ -1 +1 @@ -Subproject commit a38b428d52dcd67a70a3f553055227d6b1c86681 +Subproject commit b4bd68fa6762c63cf57adbb913475949ee162d64 From e538cf4bea7515bd6eab2d77f345e71c7ddc4da9 Mon Sep 17 00:00:00 2001 From: Dario Lipicar Date: Fri, 20 Feb 2026 20:40:13 -0300 Subject: [PATCH 29/36] Use nix-bundle-lgx (#28) * Use nix-bundle-lgx * avoid unneded checkout --- .github/workflows/build-and-publish.yml | 66 +++++-- ci/package-modules.sh | 224 +++++++++++++--------- compile.sh | 239 +++--------------------- 3 files changed, 213 insertions(+), 316 deletions(-) diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml index 8c76494..563837e 100644 --- a/.github/workflows/build-and-publish.yml +++ b/.github/workflows/build-and-publish.yml @@ -26,19 +26,54 @@ jobs: - name: List modules id: modules run: | - all_modules=$(git config --file .gitmodules --get-regexp path | awk '{print $2}' | jq -R -s -c 'split("\n") | map(select(length > 0))') + # Build module list with flake references from submodule URLs and pinned commits + all_modules=$(python3 <<'PY' + import json, subprocess, re + + lines = subprocess.check_output( + ["git", "config", "--file", ".gitmodules", "--get-regexp", r"submodule\..*\.path"], + text=True + ).strip().split("\n") + + result = [] + for line in lines: + if not line.strip(): + continue + key, path = line.split(None, 1) + name = re.match(r"submodule\.(.*)\.path", key).group(1) + url = subprocess.check_output( + ["git", "config", "--file", ".gitmodules", f"submodule.{name}.url"], + text=True + ).strip() + commit = subprocess.check_output( + ["git", "ls-tree", "HEAD", path], + text=True + ).strip().split()[2] + + # Convert GitHub URL to flake reference + m = re.match(r"https?://github\.com/(.+?)(?:\.git)?$", url) + if not m: + m = re.match(r"git@github\.com:(.+?)(?:\.git)?$", url) + if m: + flake = f"github:{m.group(1)}/{commit}" + else: + flake = f"git+{url}?rev={commit}" + + result.append({"path": path, "flake": flake}) + + print(json.dumps(result)) + PY + ) include_input="${{ inputs.include }}" exclude_input="${{ inputs.exclude }}" if [[ -n "$include_input" ]]; then - # Filter to only included modules include_json=$(echo "$include_input" | tr ',' '\n' | sed 's/^ *//;s/ *$//' | jq -R -s -c 'split("\n") | map(select(length > 0))') - modules=$(echo "$all_modules" | jq -c --argjson inc "$include_json" '[.[] | select(. as $m | $inc | any(. == $m))]') + modules=$(echo "$all_modules" | jq -c --argjson inc "$include_json" '[.[] | select(.path as $p | $inc | any(. == $p))]') elif [[ -n "$exclude_input" ]]; then - # Filter out excluded modules exclude_json=$(echo "$exclude_input" | tr ',' '\n' | sed 's/^ *//;s/ *$//' | jq -R -s -c 'split("\n") | map(select(length > 0))') - modules=$(echo "$all_modules" | jq -c --argjson exc "$exclude_json" '[.[] | select(. as $m | $exc | any(. == $m) | not)]') + modules=$(echo "$all_modules" | jq -c --argjson exc "$exclude_json" '[.[] | select(.path as $p | $exc | any(. == $p) | not)]') else modules="$all_modules" fi @@ -64,31 +99,26 @@ jobs: continue-on-error: true steps: - - uses: actions/checkout@v6 - with: - submodules: recursive - - uses: DeterminateSystems/nix-installer-action@main - uses: DeterminateSystems/magic-nix-cache-action@main - - name: Build ${{ matrix.module }} + - name: Build ${{ matrix.module.path }} id: build run: | - cd "${{ matrix.module }}" - nix bundle --bundler github:logos-co/nix-bundle-dir#qtPlugin -o result .#lib + nix bundle --bundler github:logos-co/nix-bundle-lgx#portable -o result '${{ matrix.module.flake }}#lib' - name: Collect output if: steps.build.outcome == 'success' run: | - mkdir -p "build-output/build-${{ matrix.variant.name }}/${{ matrix.module }}" - cp -rL "${{ matrix.module }}/result/." "build-output/build-${{ matrix.variant.name }}/${{ matrix.module }}/" + mkdir -p "lgx-output/${{ matrix.variant.name }}/${{ matrix.module.path }}" + cp result/*.lgx "lgx-output/${{ matrix.variant.name }}/${{ matrix.module.path }}/" - uses: actions/upload-artifact@v6 if: steps.build.outcome == 'success' with: - name: build-${{ matrix.variant.name }}--${{ matrix.module }} - path: build-output/ + name: lgx-${{ matrix.variant.name }}--${{ matrix.module.path }} + path: lgx-output/ retention-days: 1 package: @@ -98,8 +128,6 @@ jobs: steps: - uses: actions/checkout@v6 - with: - submodules: true - uses: DeterminateSystems/nix-installer-action@main @@ -113,7 +141,7 @@ jobs: - uses: actions/download-artifact@v7 with: path: artifacts - pattern: build-* + pattern: lgx-* merge-multiple: true - name: Package modules diff --git a/ci/package-modules.sh b/ci/package-modules.sh index 1804492..d3a5b97 100755 --- a/ci/package-modules.sh +++ b/ci/package-modules.sh @@ -2,18 +2,22 @@ set -euo pipefail set -x -# package-modules.sh — Create multi-variant .lgx packages from pre-built artifacts. +# package-modules.sh — Merge single-variant .lgx packages into multi-variant ones. # # Expected environment: -# LGX — path to the lgx binary +# LGX — path to the lgx binary # ARTIFACTS_DIR — path to downloaded artifacts (default: "artifacts") # # Expected directory layout under ARTIFACTS_DIR: -# build-linux-amd64//lib/... -# build-linux-arm64//lib/... -# build-darwin-arm64//lib/... +# //.lgx # -# Module metadata is read from /metadata.json in the repo checkout. +# Each input .lgx is a single-variant package produced by nix-bundle-lgx. +# This script verifies that manifests match across variants (ignoring the "main" +# field which differs per platform), then uses the lgx tool to create a fresh +# multi-variant package from the extracted per-platform files. +# +# All metadata is extracted from the single-variant lgx manifests — no submodule +# checkout is required. script_dir="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" && pwd)" repo_dir="$(cd "$script_dir/.." && pwd)" @@ -44,89 +48,107 @@ module_entries=() for module in $modules; do echo "=== Processing $module ===" - # Check which variants have build output for this module + # Collect all single-variant lgx files for this module + declare -A variant_lgx_map=() available_variants=() + for variant in "${ALL_VARIANTS[@]}"; do - variant_lib_dir="$ARTIFACTS_DIR/build-${variant}/${module}/lib" - if [[ -d "$variant_lib_dir" ]] && [[ -n "$(ls -A "$variant_lib_dir" 2>/dev/null)" ]]; then - available_variants+=("$variant") + variant_module_dir="$ARTIFACTS_DIR/${variant}/${module}" + if [[ -d "$variant_module_dir" ]]; then + lgx_file=$(find "$variant_module_dir" -maxdepth 1 -name '*.lgx' 2>/dev/null | head -n 1) + if [[ -n "$lgx_file" ]]; then + variant_lgx_map["$variant"]="$lgx_file" + available_variants+=("$variant") + fi fi done if [[ ${#available_variants[@]} -eq 0 ]]; then - echo "No build output found for $module in any variant, skipping." + echo "No lgx artifacts found for $module, skipping." continue fi echo "Available variants for $module: ${available_variants[*]}" - # Read metadata - module_metadata_path="$repo_dir/$module/metadata.json" - module_metadata_json=$(python3 - "$module_metadata_path" <<'PY' -import json -import sys + # Collect lgx file paths for verification + lgx_file_args=() + for variant in "${available_variants[@]}"; do + lgx_file_args+=("${variant_lgx_map[$variant]}") + done -try: - with open(sys.argv[1], "r") as f: - metadata = json.load(f) - result = { - "type": metadata.get("type", ""), - "name": metadata.get("name", ""), - "description": metadata.get("description", ""), - "dependencies": metadata.get("dependencies", []), - "category": metadata.get("category", ""), - "author": metadata.get("author", ""), - "version": metadata.get("version", "0.0.1"), - "main": metadata.get("main", "") - } - print(json.dumps(result)) -except (FileNotFoundError, json.JSONDecodeError, KeyError): - print(json.dumps({ - "type": "", - "name": "", - "description": "", - "dependencies": [], - "category": "", - "author": "", - "version": "0.0.1", - "main": "" - })) + # --- Verify manifests match across all single-variant lgx files (ignoring "main") --- + python3 - "${lgx_file_args[@]}" <<'PY' +import tarfile, json, sys + +def read_manifest(lgx_path): + with tarfile.open(lgx_path, 'r:gz') as tar: + for member in tar.getmembers(): + if member.name == 'manifest.json': + return json.loads(tar.extractfile(member).read()) + return None + +manifests = [] +for path in sys.argv[1:]: + m = read_manifest(path) + if m is None: + print(f"ERROR: no manifest.json found in {path}", file=sys.stderr) + sys.exit(1) + manifests.append((path, m)) + +# Compare all manifests ignoring the "main" field (differs per platform, e.g. .dylib vs .so) +def manifest_without_main(m): + return {k: v for k, v in m.items() if k != "main"} + +reference_path, reference = manifests[0] +ref_comparable = manifest_without_main(reference) + +for path, m in manifests[1:]: + comparable = manifest_without_main(m) + if comparable != ref_comparable: + print(f"ERROR: manifest mismatch between {reference_path} and {path}", file=sys.stderr) + print(f" Reference: {json.dumps(ref_comparable, sort_keys=True)}", file=sys.stderr) + print(f" Mismatch: {json.dumps(comparable, sort_keys=True)}", file=sys.stderr) + sys.exit(1) + +print(f"Manifests verified: all {len(manifests)} variant(s) match (ignoring main field).") +PY + + # --- Extract metadata from the first single-variant lgx manifest --- + first_lgx="${variant_lgx_map[${available_variants[0]}]}" + + manifest_json=$(python3 - "$first_lgx" <<'PY' +import tarfile, json, sys +with tarfile.open(sys.argv[1], 'r:gz') as tar: + for member in tar.getmembers(): + if member.name == 'manifest.json': + print(tar.extractfile(member).read().decode()) + break PY ) - module_metadata_json=${module_metadata_json//$'\n'/} - package_name=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('name', ''))") + package_name=$(echo "$manifest_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('name', ''))") if [[ -z "$package_name" ]]; then - echo "No package name found in metadata.json for $module, skipping." >&2 - continue + # Fall back to lgx filename + package_name=$(basename "$first_lgx" .lgx) fi lgx_package_path="$output_dir/${package_name}.lgx" - # Create a fresh LGX package - echo "Creating new LGX package: ${package_name}.lgx" + # --- Create multi-variant lgx package using the lgx tool --- + rm -f "${package_name}.lgx" - - "$LGX" create "$package_name" || { - echo "Failed to create LGX package for $package_name" >&2 - exit 1 - } - + "$LGX" create "$package_name" mv "${package_name}.lgx" "$lgx_package_path" - # Patch manifest.json inside the LGX package with module metadata + # Patch manifest with metadata extracted from the single-variant lgx echo "Updating package manifest with metadata..." - python3 - "$lgx_package_path" "$module_metadata_json" <<'PY' -import json -import sys -import tarfile -import io + python3 - "$lgx_package_path" "$manifest_json" <<'PY' +import json, sys, tarfile, io lgx_path = sys.argv[1] metadata = json.loads(sys.argv[2]) -# Read all members from the original archive with tarfile.open(lgx_path, 'r:gz') as tar: members = [] for member in tar.getmembers(): @@ -135,7 +157,6 @@ with tarfile.open(lgx_path, 'r:gz') as tar: else: members.append((member, None)) -# Patch the manifest content patched = [] for member, data in members: if member.name == 'manifest.json': @@ -147,7 +168,6 @@ for member, data in members: member.size = len(data) patched.append((member, data)) -# Rewrite the archive preserving original member metadata with tarfile.open(lgx_path, 'w:gz', format=tarfile.GNU_FORMAT) as tar: for member, data in patched: if data is not None: @@ -156,55 +176,85 @@ with tarfile.open(lgx_path, 'w:gz', format=tarfile.GNU_FORMAT) as tar: tar.addfile(member) PY - # Get main entry from metadata - main_entry=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('main', ''))") - - # Add each available variant + # Add each variant by extracting files from its single-variant lgx for variant in "${available_variants[@]}"; do - variant_lib_dir="$ARTIFACTS_DIR/build-${variant}/${module}/lib" + lgx_file="${variant_lgx_map[$variant]}" - if [[ -n "$main_entry" ]]; then - # Determine extension based on variant platform - case "$variant" in - darwin-*) lib_ext=".dylib" ;; - linux-*) lib_ext=".so" ;; - esac - main_path="${main_entry}${lib_ext}" + # Read the per-variant main file from this variant's lgx manifest + variant_main=$(python3 - "$lgx_file" <<'PY' +import tarfile, json, sys +with tarfile.open(sys.argv[1], 'r:gz') as tar: + for member in tar.getmembers(): + if member.name == 'manifest.json': + m = json.loads(tar.extractfile(member).read()) + print(m.get('main', '')) + break +PY +) + + # Extract variant files from the single-variant lgx into a temp directory + extract_dir=$(mktemp -d) + python3 - "$lgx_file" "$variant" "$extract_dir" <<'PY' +import tarfile, sys, os + +lgx_path = sys.argv[1] +variant = sys.argv[2] +extract_dir = sys.argv[3] + +prefix = f"variants/{variant}/" + +with tarfile.open(lgx_path, 'r:gz') as tar: + for member in tar.getmembers(): + if member.name.startswith(prefix) and member.isfile(): + rel = member.name[len(prefix):] + target = os.path.join(extract_dir, rel) + os.makedirs(os.path.dirname(target), exist_ok=True) + with tar.extractfile(member) as src: + with open(target, 'wb') as dst: + dst.write(src.read()) +PY + + # Determine main file for lgx add + if [[ -n "$variant_main" && -f "$extract_dir/$variant_main" ]]; then + main_path="$variant_main" else - # Fallback: use first file in library directory - main_file=$(ls "$variant_lib_dir" | head -n 1) - if [[ -z "$main_file" ]]; then - echo "No library files found in $variant_lib_dir" >&2 - exit 1 + # Fallback: first library file in the extracted directory + main_path=$(ls "$extract_dir" | head -n 1) + if [[ -n "$variant_main" ]]; then + echo "Warning: main '$variant_main' from manifest not found for $variant, falling back to $main_path" fi - main_path="$main_file" fi - echo "Adding variant $variant to ${package_name}.lgx" + if [[ -z "$main_path" ]]; then + echo "No files found in extracted variant $variant for $module" >&2 + rm -rf "$extract_dir" + continue + fi + + echo "Adding variant $variant to ${package_name}.lgx (main: $main_path)" "$LGX" add "$lgx_package_path" \ --variant "$variant" \ - --files "$variant_lib_dir/." \ + --files "$extract_dir/." \ --main "$main_path" \ -y || { echo "Failed to add variant $variant to LGX package for $package_name" >&2 exit 1 } + rm -rf "$extract_dir" echo "Successfully added variant $variant to ${package_name}.lgx" done - # Store entry for list.json generation (variants as comma-separated list) + # Store entry for list.json generation (metadata from the lgx manifest) variants_csv=$(IFS=,; echo "${available_variants[*]}") - module_entries+=("$module::$module_metadata_json::${package_name}.lgx::${variants_csv}") + module_entries+=("$module::$manifest_json::${package_name}.lgx::${variants_csv}") done # Generate list.json list_json_path="$output_dir/list.json" python3 - "$list_json_path" "${module_entries[@]}" <<'PY' -import json -import os -import sys +import json, os, sys list_path = sys.argv[1] entries = sys.argv[2:] diff --git a/compile.sh b/compile.sh index 01981a0..c3df862 100755 --- a/compile.sh +++ b/compile.sh @@ -8,38 +8,7 @@ cd "$script_dir" base_libraries_dir="$script_dir/libraries" list_json_path="$base_libraries_dir/list.json" -# Detect platform variant for LGX -os_name="$(uname -s)" -arch_name="$(uname -m)" - -case "$os_name" in - Darwin) - case "$arch_name" in - arm64) lgx_variant="darwin-arm64" ;; - x86_64) lgx_variant="darwin-amd64" ;; - *) - echo "Unsupported Darwin architecture: $arch_name" >&2 - exit 1 - ;; - esac - ;; - Linux) - case "$arch_name" in - x86_64) lgx_variant="linux-amd64" ;; - aarch64) lgx_variant="linux-arm64" ;; - *) - echo "Unsupported Linux architecture: $arch_name" >&2 - exit 1 - ;; - esac - ;; - *) - echo "Unsupported platform: $os_name" >&2 - exit 1 - ;; -esac - -echo "Building for platform variant: $lgx_variant" +BUNDLER="${BUNDLER:-github:logos-co/nix-bundle-lgx#portable}" if [[ ! -f .gitmodules ]]; then echo "No .gitmodules found in $script_dir" >&2 @@ -55,199 +24,52 @@ fi mkdir -p "$base_libraries_dir" -# Build lgx binary first -echo "Building lgx tool..." -if ! nix build --extra-experimental-features 'nix-command flakes' '.#lgx'; then - echo "Failed to build lgx tool" >&2 - exit 1 -fi - -lgx_binary="$script_dir/result/bin/lgx" -if [[ ! -x "$lgx_binary" ]]; then - echo "lgx binary not found at $lgx_binary" >&2 - exit 1 -fi - -echo "lgx binary ready at $lgx_binary" - # Store module metadata for list.json generation module_entries=() for module in $modules; do echo "Building $module..." - if (cd "$module" && nix build --extra-experimental-features 'nix-command flakes' '.#lib'); then + if (cd "$module" && nix bundle --extra-experimental-features 'nix-command flakes' --bundler "$BUNDLER" -o result .#lib); then echo "Built $module" - module_lib_dir="$script_dir/$module/result/lib" - if [[ ! -d "$module_lib_dir" ]]; then - echo "Expected library output directory not found for $module at $module_lib_dir" >&2 + + lgx_file=$(find "$script_dir/$module/result" -maxdepth 1 -name '*.lgx' 2>/dev/null | head -n 1) + if [[ -z "$lgx_file" ]]; then + echo "No lgx file found in $module/result/" >&2 exit 1 fi - # Extract metadata from metadata.json + package_name=$(basename "$lgx_file" .lgx) + cp "$lgx_file" "$base_libraries_dir/" + + echo "Created ${package_name}.lgx" + + # Read metadata for list.json module_metadata_path="$script_dir/$module/metadata.json" module_metadata_json=$(python3 - "$module_metadata_path" <<'PY' -import json -import sys - +import json, sys try: - with open(sys.argv[1], "r") as f: - metadata = json.load(f) - result = { - "type": metadata.get("type", ""), - "name": metadata.get("name", ""), - "description": metadata.get("description", ""), - "dependencies": metadata.get("dependencies", []), - "category": metadata.get("category", ""), - "author": metadata.get("author", ""), - "version": metadata.get("version", "0.0.1"), - "main": metadata.get("main", "") - } - print(json.dumps(result)) -except (FileNotFoundError, json.JSONDecodeError, KeyError): - print(json.dumps({ - "type": "", - "name": "", - "description": "", - "dependencies": [], - "category": "", - "author": "", - "version": "0.0.1", - "main": "" - })) + with open(sys.argv[1]) as f: + print(json.dumps(json.load(f))) +except: + print("{}") PY ) - module_metadata_json=${module_metadata_json//$'\n'/} - - # Parse metadata to get package name - package_name=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('name', ''))") - - if [[ -z "$package_name" ]]; then - echo "No package name found in metadata.json for $module" >&2 - exit 1 - fi - - lgx_package_path="$base_libraries_dir/${package_name}.lgx" - - # Create or update LGX package - if [[ ! -f "$lgx_package_path" ]]; then - echo "Creating new LGX package: ${package_name}.lgx" - - # Remove any stale lgx file in current directory from previous failed run - rm -f "${package_name}.lgx" - - "$lgx_binary" create "$package_name" || { - echo "Failed to create LGX package for $package_name" >&2 - exit 1 - } - - # Move created package to libraries directory - mv "${package_name}.lgx" "$lgx_package_path" - - # Update manifest.json inside the package with metadata - echo "Updating package manifest with metadata..." - python3 - "$lgx_package_path" "$module_metadata_json" <<'PY' -import json -import sys -import tarfile -import io -lgx_path = sys.argv[1] -metadata = json.loads(sys.argv[2]) - -# Read all members from the original archive -with tarfile.open(lgx_path, 'r:gz') as tar: - members = [] - for member in tar.getmembers(): - if member.isfile(): - members.append((member, tar.extractfile(member).read())) - else: - members.append((member, None)) - -# Patch the manifest content -patched = [] -for member, data in members: - if member.name == 'manifest.json': - manifest = json.loads(data) - for key in ('name', 'version', 'description', 'author', 'type', 'category', 'dependencies'): - if metadata.get(key): - manifest[key] = metadata[key] - data = json.dumps(manifest, indent=2).encode() - member.size = len(data) - patched.append((member, data)) - -# Rewrite the archive preserving original member metadata -with tarfile.open(lgx_path, 'w:gz', format=tarfile.GNU_FORMAT) as tar: - for member, data in patched: - if data is not None: - tar.addfile(member, io.BytesIO(data)) - else: - tar.addfile(member) -PY - fi - - # Get main entry from metadata, or fall back to first file - main_entry=$(echo "$module_metadata_json" | python3 -c "import json, sys; print(json.load(sys.stdin).get('main', ''))") - - if [[ -n "$main_entry" ]]; then - # Determine extension based on platform - case "$os_name" in - Darwin) lib_ext=".dylib" ;; - Linux) lib_ext=".so" ;; - esac - main_path="${main_entry}${lib_ext}" - else - # Fallback: use first file in library directory - main_file=$(ls "$module_lib_dir" | head -n 1) - if [[ -z "$main_file" ]]; then - echo "No library files found in $module_lib_dir" >&2 - exit 1 - fi - main_path="$main_file" - fi - - echo "Adding variant $lgx_variant to ${package_name}.lgx" - "$lgx_binary" add "$lgx_package_path" \ - --variant "$lgx_variant" \ - --files "$module_lib_dir/." \ - --main "$main_path" \ - -y || { - echo "Failed to add variant to LGX package for $package_name" >&2 - exit 1 - } - - echo "Successfully added variant $lgx_variant to ${package_name}.lgx" - - # Store entry for list.json generation module_entries+=("$module::$module_metadata_json::${package_name}.lgx") else - echo "Failed building $module (nix build '.#lib')" >&2 + echo "Failed building $module" >&2 exit 1 fi done -# Generate list.json with package references +# Generate list.json python3 - "$list_json_path" "${module_entries[@]}" <<'PY' -import json -import os -import sys +import json, os, sys list_path = sys.argv[1] entries = sys.argv[2:] -def load_existing(path): - try: - with open(path, "r") as f: - return json.load(f) - except FileNotFoundError: - return [] - except Exception: - return [] - -data = load_existing(list_path) -index = {} -for item in data: - if isinstance(item, dict) and "name" in item: - index[item["name"]] = item +result_index = {} for raw in entries: if "::" not in raw: @@ -255,19 +77,14 @@ for raw in entries: parts = raw.split("::", 2) if len(parts) != 3: continue - + name, metadata_json, package_filename = parts try: metadata = json.loads(metadata_json) except json.JSONDecodeError: metadata = {} - - item = index.get(name, {"name": name}) - - # Set package field - item["package"] = package_filename - - # Update metadata fields from metadata.json + + item = {"name": name, "package": package_filename} if "type" in metadata: item["type"] = metadata["type"] if "name" in metadata: @@ -280,10 +97,12 @@ for raw in entries: item["category"] = metadata["category"] if "author" in metadata: item["author"] = metadata["author"] - - index[name] = item + if metadata.get("version"): + item["version"] = metadata["version"] -result = [index[k] for k in sorted(index)] + result_index[name] = item + +result = [result_index[k] for k in sorted(result_index)] os.makedirs(os.path.dirname(list_path), exist_ok=True) with open(list_path, "w") as f: json.dump(result, f, indent=2) From ca9bf485c0c8dd3565b2e771c09610a34a64dc59 Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Sat, 21 Feb 2026 02:14:32 +0100 Subject: [PATCH 30/36] Bump logos-delivery-module with fix for linux builds --- logos-delivery-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-delivery-module b/logos-delivery-module index bceeea1..af50ea3 160000 --- a/logos-delivery-module +++ b/logos-delivery-module @@ -1 +1 @@ -Subproject commit bceeea1fbb19a7e3d30adf83f65924a9428bd055 +Subproject commit af50ea3593a18d073e8411ac03bf0b46dbcebd7b From 63f431ed866475def2c60d9a3be2784172f3ccb3 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Sat, 21 Feb 2026 03:09:09 -0300 Subject: [PATCH 31/36] enforce main library presence in LGX packages --- ci/package-modules.sh | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/ci/package-modules.sh b/ci/package-modules.sh index d3a5b97..7585a1c 100755 --- a/ci/package-modules.sh +++ b/ci/package-modules.sh @@ -181,13 +181,14 @@ PY lgx_file="${variant_lgx_map[$variant]}" # Read the per-variant main file from this variant's lgx manifest - variant_main=$(python3 - "$lgx_file" <<'PY' + variant_main=$(python3 - "$lgx_file" "$variant" <<'PY' import tarfile, json, sys with tarfile.open(sys.argv[1], 'r:gz') as tar: for member in tar.getmembers(): if member.name == 'manifest.json': m = json.loads(tar.extractfile(member).read()) - print(m.get('main', '')) + main = m.get('main', {}) + print(main.get(sys.argv[2], '')) break PY ) @@ -215,22 +216,14 @@ with tarfile.open(lgx_path, 'r:gz') as tar: PY # Determine main file for lgx add - if [[ -n "$variant_main" && -f "$extract_dir/$variant_main" ]]; then - main_path="$variant_main" - else - # Fallback: first library file in the extracted directory - main_path=$(ls "$extract_dir" | head -n 1) - if [[ -n "$variant_main" ]]; then - echo "Warning: main '$variant_main' from manifest not found for $variant, falling back to $main_path" - fi - fi - - if [[ -z "$main_path" ]]; then - echo "No files found in extracted variant $variant for $module" >&2 + if [[ -z "$variant_main" || ! -f "$extract_dir/$variant_main" ]]; then + echo "ERROR: main file '${variant_main:-}' not found for variant $variant of $module, skipping variant." >&2 rm -rf "$extract_dir" continue fi + main_path="$variant_main" + echo "Adding variant $variant to ${package_name}.lgx (main: $main_path)" "$LGX" add "$lgx_package_path" \ --variant "$variant" \ From 78b2f5802f7c95c2fcded33785a610bc3d195741 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Sat, 21 Feb 2026 10:33:26 -0300 Subject: [PATCH 32/36] bump logos blockchain module and ui --- logos-blockchain-module | 2 +- logos-blockchain-ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/logos-blockchain-module b/logos-blockchain-module index 4e57037..376ea35 160000 --- a/logos-blockchain-module +++ b/logos-blockchain-module @@ -1 +1 @@ -Subproject commit 4e5703787ea3bc1af23c446e95940a804dfe4bf4 +Subproject commit 376ea354780cdd62193529c4f657d55c83e42e29 diff --git a/logos-blockchain-ui b/logos-blockchain-ui index da055ad..8c284c0 160000 --- a/logos-blockchain-ui +++ b/logos-blockchain-ui @@ -1 +1 @@ -Subproject commit da055ad72ed45c916057af04208dd4ea7b8ddc83 +Subproject commit 8c284c02d217061996cbfdaf62dada7944724b84 From 0738d502b0421cbcaaab42da9aec33760a65aa7e Mon Sep 17 00:00:00 2001 From: Arnaud Date: Mon, 23 Feb 2026 13:56:33 +0400 Subject: [PATCH 33/36] Add storage ui --- .gitmodules | 3 +++ README.md | 1 + logos-storage-ui | 1 + 3 files changed, 5 insertions(+) create mode 160000 logos-storage-ui diff --git a/.gitmodules b/.gitmodules index 82773fb..0f81ee9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -43,3 +43,6 @@ [submodule "logos-delivery-module"] path = logos-delivery-module url = https://github.com/logos-co/logos-delivery-module.git +[submodule "logos-storage-ui"] + path = logos-storage-ui + url = https://github.com/logos-co/logos-storage-ui diff --git a/README.md b/README.md index d72ee69..c734639 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ to compile all modules in one go | logos-blockchain-ui | https://github.com/logos-blockchain/logos-blockchain-ui | | logos-storage-module | https://github.com/logos-co/logos-storage-module | | logos-delivery-module | https://github.com/logos-co/logos-delivery-module | +| logos-storage-ui | https://github.com/logos-co/logos-storage-ui | ## Requirements diff --git a/logos-storage-ui b/logos-storage-ui new file mode 160000 index 0000000..006d0b6 --- /dev/null +++ b/logos-storage-ui @@ -0,0 +1 @@ +Subproject commit 006d0b6a68da424a05474344af6070004da0d239 From 15cc6d9f60ebf42a67a7d41da67bc87fcf8bdd6a Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Mon, 23 Feb 2026 20:35:13 -0300 Subject: [PATCH 34/36] bump logos-blockchain module and ui --- logos-blockchain-module | 2 +- logos-blockchain-ui | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/logos-blockchain-module b/logos-blockchain-module index 376ea35..57b447e 160000 --- a/logos-blockchain-module +++ b/logos-blockchain-module @@ -1 +1 @@ -Subproject commit 376ea354780cdd62193529c4f657d55c83e42e29 +Subproject commit 57b447e6d7e30b289a8c00bcc2ba9d9426952ad7 diff --git a/logos-blockchain-ui b/logos-blockchain-ui index 8c284c0..f948acd 160000 --- a/logos-blockchain-ui +++ b/logos-blockchain-ui @@ -1 +1 @@ -Subproject commit 8c284c02d217061996cbfdaf62dada7944724b84 +Subproject commit f948acd17a3da804ba4eeb70e5222f1c67fbe192 From 1d37af1681a021c77a88c596628d655a66bfb888 Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Mon, 23 Feb 2026 21:01:41 -0300 Subject: [PATCH 35/36] add icon to combined manifest.json --- ci/package-modules.sh | 2 +- flake.lock | 250 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 240 insertions(+), 12 deletions(-) diff --git a/ci/package-modules.sh b/ci/package-modules.sh index 7585a1c..88da527 100755 --- a/ci/package-modules.sh +++ b/ci/package-modules.sh @@ -161,7 +161,7 @@ patched = [] for member, data in members: if member.name == 'manifest.json': manifest = json.loads(data) - for key in ('name', 'version', 'description', 'author', 'type', 'category', 'dependencies'): + for key in ('name', 'version', 'description', 'author', 'type', 'category', 'dependencies', 'icon'): if metadata.get(key): manifest[key] = metadata[key] data = json.dumps(manifest, indent=2).encode() diff --git a/flake.lock b/flake.lock index a52da91..e78b27d 100644 --- a/flake.lock +++ b/flake.lock @@ -1,15 +1,195 @@ { "nodes": { - "logos-package": { + "logos-capability-module": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk", + "logos-liblogos": "logos-liblogos_2", + "nixpkgs": [ + "logos-package", + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1767809111, + "narHash": "sha256-jehjsB+BpDJlVu3I7x+vFVOdXmy9MDmFTJtRqzFUONo=", + "owner": "logos-co", + "repo": "logos-capability-module", + "rev": "7b35383e0aa4e28a4633ed18a87efb57636939b1", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-capability-module", + "type": "github" + } + }, + "logos-cpp-sdk": { "inputs": { "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1768925546, - "narHash": "sha256-Y4sgYs9wtZ9sHAuKl9LUy//ReeF4/AyK8HlnZsYrSqg=", + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_2": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1761230734, + "narHash": "sha256-CMRUwXH7pJZ1OI6bd/TDDDXKqQ1tQZHQEOOwK8TgYHI=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "4b143922c190df00bb3835441c9f0075cb28283b", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_3": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1767724329, + "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-cpp-sdk_4": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1767724329, + "narHash": "sha256-UPkqxqxbKwU5Dmu00TnjiJVXUmfVylF3p1qziEuYwIE=", + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "rev": "32f1d7080d784ff044d91d076ef2f0c7305d4784", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-cpp-sdk", + "type": "github" + } + }, + "logos-liblogos": { + "inputs": { + "logos-capability-module": "logos-capability-module", + "logos-cpp-sdk": "logos-cpp-sdk_3", + "logos-module": "logos-module", + "nixpkgs": [ + "logos-package", + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770154824, + "narHash": "sha256-WGI+3FkPdeytfLJ3ZJYr1O8esUnQjcmMJEYwB/EBZMs=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "901dd86d47216b15b6f1260b7b6bb4ecd88a8f9d", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-liblogos_2": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_2", + "nixpkgs": [ + "logos-package", + "logos-liblogos", + "logos-capability-module", + "logos-liblogos", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1761845775, + "narHash": "sha256-ulK8xq05ejK6qIgZ7WtWb/MJt2rk5BKfDA2z7mM3wq8=", + "owner": "logos-co", + "repo": "logos-liblogos", + "rev": "a92c2c1268bc70764c8f73c7bce07d21024f5af9", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-liblogos", + "type": "github" + } + }, + "logos-module": { + "inputs": { + "logos-cpp-sdk": "logos-cpp-sdk_4", + "nixpkgs": [ + "logos-package", + "logos-liblogos", + "logos-module", + "logos-cpp-sdk", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770062426, + "narHash": "sha256-zc7ZxDTlqOCYGyEHhrTA/7GS1EWh7+4amdPUKh+gGds=", + "owner": "logos-co", + "repo": "logos-module", + "rev": "f7ee69d9ad9f27c84f04f59896e9194125e951dc", + "type": "github" + }, + "original": { + "owner": "logos-co", + "repo": "logos-module", + "type": "github" + } + }, + "logos-package": { + "inputs": { + "logos-liblogos": "logos-liblogos", + "nixpkgs": [ + "logos-package", + "logos-liblogos", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1771887671, + "narHash": "sha256-eIzmR3N5QnR5lcBT3N58v49ggl9MzUYSRgQznex1ayM=", "owner": "logos-co", "repo": "logos-package", - "rev": "9230ae37c9d289c0c355dcf9fa40fd3be2e99f17", + "rev": "d9a741359b17b928afae59cf3c6ee00057b7d93e", "type": "github" }, "original": { @@ -20,11 +200,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768127708, - "narHash": "sha256-1Sm77VfZh3mU0F5OqKABNLWxOuDeHIlcFjsXeeiPazs=", + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ffbc9f8cbaacfb331b6017d5a5abb21a492c9a38", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", "type": "github" }, "original": { @@ -36,11 +216,59 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1768564909, - "narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=", + "lastModified": 1759036355, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "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, + "narHash": "sha256-0m27AKv6ka+q270dw48KflE0LwQYrO7Fm4/2//KCVWg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e9f00bd893984bc8ce46c895c3bf7cac95331127", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_5": { + "locked": { + "lastModified": 1771369470, + "narHash": "sha256-0NBlEBKkN3lufyvFegY4TYv5mCNHbi5OmBDrzihbBMQ=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0182a361324364ae3f436a63005877674cf45efb", "type": "github" }, "original": { @@ -53,7 +281,7 @@ "root": { "inputs": { "logos-package": "logos-package", - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_5" } } }, From 176859c821aa0759ff50a9e991d251c2bb42244f Mon Sep 17 00:00:00 2001 From: Dario Gabriel Lipicar Date: Tue, 24 Feb 2026 09:16:57 -0300 Subject: [PATCH 36/36] bump logos-blockchain-module --- logos-blockchain-module | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logos-blockchain-module b/logos-blockchain-module index 57b447e..888a668 160000 --- a/logos-blockchain-module +++ b/logos-blockchain-module @@ -1 +1 @@ -Subproject commit 57b447e6d7e30b289a8c00bcc2ba9d9426952ad7 +Subproject commit 888a66849ffc9babeb33ac070145b29861f0a23d