From 456f88ee9e35e3fc3c9ff201ac7f5bde3447979a Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:01:55 +0100 Subject: [PATCH 1/9] fix: build fails for windows target --- .cargo/config.toml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.cargo/config.toml b/.cargo/config.toml index 630c55231..f3aca2231 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -6,3 +6,12 @@ rustflags = ["-C", "target-feature=-crt-static", "-C", "target-cpu=x86-64"] [target.x86_64-unknown-linux-gnu] rustflags = ["-C", "target-feature=-crt-static", "-C", "target-cpu=x86-64"] + +[target.x86_64-pc-windows-gnu] +linker = "x86_64-w64-mingw32-gcc-posix" +ar = "x86_64-w64-mingw32-ar" + +[env] +CC_x86_64_pc_windows_gnu = "x86_64-w64-mingw32-gcc-posix" +CXX_x86_64_pc_windows_gnu = "x86_64-w64-mingw32-g++-posix" +AR_x86_64_pc_windows_gnu = "x86_64-w64-mingw32-ar" From 1014158ce99858be8c17793ca6efae4be5819bd2 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:07:15 +0100 Subject: [PATCH 2/9] build: only create a release when tag is set --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cd296c688..9d2622144 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ on: inputs: tag: description: "Version (i.e. v0.1.0)" - required: true + required: false permissions: id-token: write @@ -700,6 +700,7 @@ jobs: uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + if: ${{ github.event.inputs.tag != '' }} with: tag_name: ${{ github.event.inputs.tag }} files: | From 98b660d4b80cba57859d8274fab946f1dae3e55d Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:16:39 +0100 Subject: [PATCH 3/9] chore: remove redundant settings from release.yml --- .cargo/config.toml | 1 + .github/workflows/release.yml | 90 +++++++++++++++++------------------ 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index f3aca2231..3d438521b 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -15,3 +15,4 @@ ar = "x86_64-w64-mingw32-ar" CC_x86_64_pc_windows_gnu = "x86_64-w64-mingw32-gcc-posix" CXX_x86_64_pc_windows_gnu = "x86_64-w64-mingw32-g++-posix" AR_x86_64_pc_windows_gnu = "x86_64-w64-mingw32-ar" +CFLAGS_x86_64_pc_windows_gnu = "-O2" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9d2622144..fc33345f8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,8 +3,8 @@ name: Release Dash Evo Tool on: push: tags: - - 'v*' - - 'v*-dev.*' + - "v*" + - "v*-dev.*" release: types: - published @@ -121,10 +121,6 @@ jobs: run: | cargo build --release --target ${{ matrix.target }} mv target/${{ matrix.target }}/release/dash-evo-tool${{ matrix.ext }} dash-evo-tool/dash-evo-tool${{ matrix.ext }} - env: - CC_x86_64_pc_windows_gnu: x86_64-w64-mingw32-gcc - AR_x86_64_pc_windows_gnu: x86_64-w64-mingw32-ar - CFLAGS_x86_64_pc_windows_gnu: "-O2" - name: Package release run: | @@ -133,7 +129,7 @@ jobs: - name: Attest uses: actions/attest-build-provenance@v1 with: - subject-path: 'dash-evo-tool-${{ matrix.platform }}.zip' + subject-path: "dash-evo-tool-${{ matrix.platform }}.zip" - name: Upload build artifact uses: actions/upload-artifact@v4 @@ -158,20 +154,20 @@ jobs: run: | echo "Disk usage before initial cleanup:" df -h - + # Clean up homebrew cache brew cleanup --prune=all || true - + # Remove Xcode caches sudo rm -rf ~/Library/Developer/CoreSimulator/Caches/dyld 2>/dev/null || true sudo rm -rf ~/Library/Developer/Xcode/DerivedData 2>/dev/null || true sudo rm -rf ~/Library/Caches/com.apple.dt.Xcode 2>/dev/null || true - + # Clean system caches sudo rm -rf /Library/Caches/* 2>/dev/null || true sudo rm -rf /System/Library/Caches/* 2>/dev/null || true sudo rm -rf /private/var/folders/* 2>/dev/null || true - + echo "Disk usage after initial cleanup:" df -h @@ -194,7 +190,7 @@ jobs: rm -rf target/aarch64-apple-darwin/release/.fingerprint rm -rf target/aarch64-apple-darwin/debug rm -rf target/debug - + # Remove the actual binary from target since we copied it rm -f target/aarch64-apple-darwin/release/dash-evo-tool @@ -300,37 +296,37 @@ jobs: echo "Disk usage before cleanup:" df -h du -sh ~/* 2>/dev/null | sort -rh | head -20 - + # Remove the ENTIRE target directory since we already copied the binary rm -rf target - + # Remove the entire Cargo directory rm -rf ~/.cargo - + # Clean up homebrew completely brew cleanup --prune=all rm -rf $(brew --cache) - + # Remove any unnecessary Xcode simulators and caches sudo rm -rf ~/Library/Developer/CoreSimulator 2>/dev/null || true sudo rm -rf ~/Library/Developer/Xcode 2>/dev/null || true sudo rm -rf ~/Library/Caches 2>/dev/null || true - + # Remove temporary icon files after creating the app bundle rm -rf AppIcon.iconset 2>/dev/null || true - + # Clean system caches more aggressively sudo rm -rf /Library/Caches/* 2>/dev/null || true sudo rm -rf /System/Library/Caches/* 2>/dev/null || true sudo rm -rf /private/var/folders/* 2>/dev/null || true sudo rm -rf /Users/runner/Library/Caches/* 2>/dev/null || true - + # Remove any iOS simulators and SDKs we don't need sudo rm -rf /Library/Developer/CoreSimulator 2>/dev/null || true sudo rm -rf /Applications/Xcode*.app/Contents/Developer/Platforms/iPhoneOS.platform 2>/dev/null || true sudo rm -rf /Applications/Xcode*.app/Contents/Developer/Platforms/AppleTVOS.platform 2>/dev/null || true sudo rm -rf /Applications/Xcode*.app/Contents/Developer/Platforms/WatchOS.platform 2>/dev/null || true - + echo "Disk usage after cleanup:" df -h du -sh ~/* 2>/dev/null | sort -rh | head -20 @@ -340,14 +336,14 @@ jobs: # Get app size for sparse image APP_SIZE=$(du -sm "build/Dash Evo Tool.app" | cut -f1) DMG_SIZE=$((APP_SIZE + 50)) # Add 50MB padding - + # Create a sparse image instead of using srcfolder # Sparse images only use disk space as needed hdiutil create -size ${DMG_SIZE}m -type SPARSE -fs HFS+ -volname "Dash Evo Tool" temp.sparseimage - + # Mount the sparse image hdiutil mount temp.sparseimage -mountpoint /Volumes/"Dash Evo Tool" - + # Copy app to mounted volume cp -r "build/Dash Evo Tool.app" /Volumes/"Dash Evo Tool"/ ln -s /Applications /Volumes/"Dash Evo Tool"/Applications @@ -356,13 +352,13 @@ jobs: rm -rf /Volumes/"Dash Evo Tool"/.fseventsd rm -rf /Volumes/"Dash Evo Tool"/.Spotlight-V100 rm -f /Volumes/"Dash Evo Tool"/.DS_Store - + # Unmount hdiutil detach /Volumes/"Dash Evo Tool" - + # Convert sparse image to compressed DMG hdiutil convert temp.sparseimage -format UDZO -o dash-evo-tool-macos-arm64.dmg - + # Clean up sparse image rm -f temp.sparseimage @@ -400,7 +396,7 @@ jobs: - name: Attest uses: actions/attest-build-provenance@v1 with: - subject-path: 'dash-evo-tool-macos-arm64.dmg' + subject-path: "dash-evo-tool-macos-arm64.dmg" - name: Upload build artifact uses: actions/upload-artifact@v4 @@ -425,20 +421,20 @@ jobs: run: | echo "Disk usage before initial cleanup:" df -h - + # Clean up homebrew cache brew cleanup --prune=all || true - + # Remove Xcode caches sudo rm -rf ~/Library/Developer/CoreSimulator/Caches/dyld 2>/dev/null || true sudo rm -rf ~/Library/Developer/Xcode/DerivedData 2>/dev/null || true sudo rm -rf ~/Library/Caches/com.apple.dt.Xcode 2>/dev/null || true - + # Clean system caches sudo rm -rf /Library/Caches/* 2>/dev/null || true sudo rm -rf /System/Library/Caches/* 2>/dev/null || true sudo rm -rf /private/var/folders/* 2>/dev/null || true - + echo "Disk usage after initial cleanup:" df -h @@ -461,7 +457,7 @@ jobs: rm -rf target/x86_64-apple-darwin/release/.fingerprint rm -rf target/x86_64-apple-darwin/debug rm -rf target/debug - + # Remove the actual binary from target since we copied it rm -f target/x86_64-apple-darwin/release/dash-evo-tool @@ -567,37 +563,37 @@ jobs: echo "Disk usage before cleanup:" df -h du -sh ~/* 2>/dev/null | sort -rh | head -20 - + # Remove the ENTIRE target directory since we already copied the binary rm -rf target - + # Remove the entire Cargo directory rm -rf ~/.cargo - + # Clean up homebrew completely brew cleanup --prune=all rm -rf $(brew --cache) - + # Remove any unnecessary Xcode simulators and caches sudo rm -rf ~/Library/Developer/CoreSimulator 2>/dev/null || true sudo rm -rf ~/Library/Developer/Xcode 2>/dev/null || true sudo rm -rf ~/Library/Caches 2>/dev/null || true - + # Remove temporary icon files after creating the app bundle rm -rf AppIcon.iconset 2>/dev/null || true - + # Clean system caches more aggressively sudo rm -rf /Library/Caches/* 2>/dev/null || true sudo rm -rf /System/Library/Caches/* 2>/dev/null || true sudo rm -rf /private/var/folders/* 2>/dev/null || true sudo rm -rf /Users/runner/Library/Caches/* 2>/dev/null || true - + # Remove any iOS simulators and SDKs we don't need sudo rm -rf /Library/Developer/CoreSimulator 2>/dev/null || true sudo rm -rf /Applications/Xcode*.app/Contents/Developer/Platforms/iPhoneOS.platform 2>/dev/null || true sudo rm -rf /Applications/Xcode*.app/Contents/Developer/Platforms/AppleTVOS.platform 2>/dev/null || true sudo rm -rf /Applications/Xcode*.app/Contents/Developer/Platforms/WatchOS.platform 2>/dev/null || true - + echo "Disk usage after cleanup:" df -h du -sh ~/* 2>/dev/null | sort -rh | head -20 @@ -607,24 +603,24 @@ jobs: # Get app size for sparse image APP_SIZE=$(du -sm "build/Dash Evo Tool.app" | cut -f1) DMG_SIZE=$((APP_SIZE + 50)) # Add 50MB padding - + # Create a sparse image instead of using srcfolder # Sparse images only use disk space as needed hdiutil create -size ${DMG_SIZE}m -type SPARSE -fs HFS+ -volname "Dash Evo Tool" temp.sparseimage - + # Mount the sparse image hdiutil mount temp.sparseimage -mountpoint /Volumes/"Dash Evo Tool" - + # Copy app to mounted volume cp -r "build/Dash Evo Tool.app" /Volumes/"Dash Evo Tool"/ ln -s /Applications /Volumes/"Dash Evo Tool"/Applications - + # Unmount hdiutil detach /Volumes/"Dash Evo Tool" - + # Convert sparse image to compressed DMG hdiutil convert temp.sparseimage -format UDZO -o dash-evo-tool-macos-x86_64.dmg - + # Clean up sparse image rm -f temp.sparseimage @@ -662,7 +658,7 @@ jobs: - name: Attest uses: actions/attest-build-provenance@v1 with: - subject-path: 'dash-evo-tool-macos-x86_64.dmg' + subject-path: "dash-evo-tool-macos-x86_64.dmg" - name: Upload build artifact uses: actions/upload-artifact@v4 From ca0d42f12e9022eaba7deb3c444bad1799ea7b56 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 13:47:47 +0100 Subject: [PATCH 4/9] doc: windows requirements --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 84cc820e5..0c9cd47ce 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ The tool supports both Mainnet and Testnet networks. Check out the [documentatio - [Prerequisites](#prerequisites) - [Rust Installation](#rust-installation) - [Dependencies](#dependencies) + - [Windows Runtime Dependencies](#windows-runtime-dependencies) - [Dash Core Wallet Setup](#dash-core-wallet-setup) - [Installation](#installation) - [Getting Started](#getting-started) @@ -67,6 +68,14 @@ system, unzip, and install: sudo unzip protoc-*-linux-x86_64.zip -d /usr/local ``` +### Windows Runtime Dependencies + +If you use the prebuilt Windows binary, make sure the target machine has: + +- Microsoft Visual C++ Redistributable (vc_redist x64): https://aka.ms/vc14/vc_redist.x64.exe +- OpenGL 2.0 support. If OpenGL 2.0 is not available (or the app fails to start with OpenGL-related errors), install the OpenCL, OpenGL, and Vulkan Compatibility Pack: + https://apps.microsoft.com/detail/9nqpsl29bfff?ocid=webpdpshare + ### Dash Core Wallet Setup - **Dash Core Wallet**: Download and install from [dash.org/wallets](https://www.dash.org/wallets/). From b058fd39730ffa4ae2cd679eb84b2d49b1c7e80b Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:41:22 +0100 Subject: [PATCH 5/9] fix: windows icon --- .github/workflows/release.yml | 2 +- assets/DET_LOGO.ico | Bin 0 -> 41249 bytes build.rs | 60 ++++++++++++++++++++++++++++++++++ src/main.rs | 2 ++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 assets/DET_LOGO.ico diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc33345f8..5d40e103c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -93,7 +93,7 @@ jobs: - name: Install essentials if: ${{ runner.os == 'Linux' }} - run: sudo apt-get update && sudo apt-get install -y build-essential pkg-config clang cmake unzip libsqlite3-dev gcc-mingw-w64 mingw-w64 libsqlite3-dev mingw-w64-x86-64-dev gcc-aarch64-linux-gnu zip && uname -a && cargo clean + run: sudo apt-get update && sudo apt-get install -y build-essential pkg-config clang cmake unzip libsqlite3-dev gcc-mingw-w64 mingw-w64 libsqlite3-dev mingw-w64-x86-64-dev binutils-mingw-w64-x86-64 gcc-aarch64-linux-gnu zip && uname -a && cargo clean - name: Install protoc (ARM) if: ${{ matrix.platform == 'linux-arm64' }} diff --git a/assets/DET_LOGO.ico b/assets/DET_LOGO.ico new file mode 100644 index 0000000000000000000000000000000000000000..54200221b498c4ba833fb242d4d205714273617a GIT binary patch literal 41249 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 GasLCgG{cJk literal 0 HcmV?d00001 diff --git a/build.rs b/build.rs index 4e6bfb5c6..229d4c2eb 100644 --- a/build.rs +++ b/build.rs @@ -1,8 +1,11 @@ use std::env; use std::path::Path; +use std::process::Command; fn main() { println!("cargo:rerun-if-changed=assets/DET_LOGO.ico"); + println!("cargo:rerun-if-changed=assets/DET_LOGO.png"); + println!("cargo:rerun-if-env-changed=WINDRES"); let target = env::var("TARGET").unwrap_or_default(); if !target.contains("windows") { @@ -24,6 +27,22 @@ fn main() { .expect("icon path must be valid UTF-8 for the resource compiler"); res.set_icon(icon_str); + let windres_cmd = resolve_windres(); + if let Some(cmd) = windres_cmd { + res.set_windres_path(&cmd); + let ar_cmd = resolve_ar(&target).unwrap_or_else(|| { + panic!( + "Required tool not found: ar. Set AR_{} or AR, or install x86_64-w64-mingw32-ar.", + target.replace('-', "_") + ) + }); + res.set_ar_path(&ar_cmd); + } else { + panic!( + "Required tool not found: windres. Set WINDRES or install x86_64-w64-mingw32-windres." + ); + } + if let Ok(version) = env::var("CARGO_PKG_VERSION") { res.set("FileVersion", &version); res.set("ProductVersion", &version); @@ -37,3 +56,44 @@ fn main() { panic!("Failed to embed Windows resources: {err}"); } } + +fn resolve_windres() -> Option { + resolve_tool( + &[String::from("WINDRES")], + &["x86_64-w64-mingw32-windres", "windres"], + ) +} + +fn resolve_ar(target: &str) -> Option { + let ar_target_key = format!("AR_{}", target.replace('-', "_")); + resolve_tool( + &[ar_target_key, String::from("AR")], + &["x86_64-w64-mingw32-ar", "ar"], + ) +} + +fn resolve_tool(env_keys: &[String], candidates: &[&str]) -> Option { + for key in env_keys { + if let Ok(cmd) = env::var(key) && is_available(&cmd) { + return Some(cmd); + } + } + + for &cmd in candidates { + if is_available(cmd) { + return Some(cmd.to_string()); + } + } + + None +} + +fn is_available(cmd: &str) -> bool { + Command::new(cmd) + .arg("--version") + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .status() + .map(|status| status.success()) + .unwrap_or(false) +} diff --git a/src/main.rs b/src/main.rs index b26319f3f..127217a48 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,8 @@ fn load_icon() -> egui::IconData { let image = image::load_from_memory(icon_bytes) .expect("Failed to load icon") .to_rgba8(); + // Windows can ignore overly large icons; keep a reasonable size. + let image = image::imageops::resize(&image, 64, 64, image::imageops::FilterType::Lanczos3); let (width, height) = image.dimensions(); egui::IconData { rgba: image.into_raw(), From 77a5b51e809c73e82faeb72499ed0cbfa8b42e86 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:04:33 +0100 Subject: [PATCH 6/9] build: change grovestark revision --- Cargo.lock | 151 ++--------------------------------------------------- Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 147 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fe7c0b67d..d7ff72dc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -849,24 +849,6 @@ dependencies = [ "which 4.4.2", ] -[[package]] -name = "bindgen" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" -dependencies = [ - "bitflags 2.10.0", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.1", - "shlex", - "syn 2.0.114", -] - [[package]] name = "bip37-bloom-filter" version = "0.1.0" @@ -1159,16 +1141,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "calloop" version = "0.13.0" @@ -1452,15 +1424,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[package]] -name = "colored" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" -dependencies = [ - "windows-sys 0.61.2", -] - [[package]] name = "combine" version = "4.6.7" @@ -2355,7 +2318,7 @@ dependencies = [ "serde_json", "serde_repr", "sha2", - "strum 0.26.3", + "strum", "thiserror 2.0.18", "tracing", ] @@ -3490,18 +3453,13 @@ dependencies = [ "grovedb-element", "grovedb-merk", "grovedb-path", - "grovedb-storage", "grovedb-version", - "grovedb-visualize", "hex", "hex-literal", "indexmap 2.13.0", "integer-encoding", - "intmap", - "itertools 0.14.0", "reqwest", "sha2", - "tempfile", "thiserror 2.0.18", ] @@ -3524,7 +3482,6 @@ dependencies = [ "bincode_derive", "grovedb-path", "grovedb-version", - "grovedb-visualize", "hex", "integer-encoding", "thiserror 2.0.18", @@ -3551,19 +3508,15 @@ dependencies = [ "bincode_derive", "blake3", "byteorder", - "colored", "ed", "grovedb-costs", "grovedb-element", "grovedb-path", - "grovedb-storage", "grovedb-version", "grovedb-visualize", "hex", "indexmap 2.13.0", "integer-encoding", - "num_cpus", - "rand 0.8.5", "thiserror 2.0.18", ] @@ -3575,25 +3528,6 @@ dependencies = [ "hex", ] -[[package]] -name = "grovedb-storage" -version = "4.0.0" -source = "git+https://github.com/dashpay/grovedb?rev=33dfd48a1718160cb333fa95424be491785f1897#33dfd48a1718160cb333fa95424be491785f1897" -dependencies = [ - "blake3", - "grovedb-costs", - "grovedb-path", - "grovedb-visualize", - "hex", - "integer-encoding", - "lazy_static", - "num_cpus", - "rocksdb", - "strum 0.27.2", - "tempfile", - "thiserror 2.0.18", -] - [[package]] name = "grovedb-version" version = "4.0.0" @@ -3615,7 +3549,7 @@ dependencies = [ [[package]] name = "grovestark" version = "0.1.0" -source = "git+https://www.github.com/dashpay/grovestark?rev=a70bdb1adac080d4f1dc10f2f4480d9dacd0f0da#a70bdb1adac080d4f1dc10f2f4480d9dacd0f0da" +source = "git+https://www.github.com/dashpay/grovestark?rev=ee2ed062a14a929b3e1297584fdb01fea598e9b2#ee2ed062a14a929b3e1297584fdb01fea598e9b2" dependencies = [ "ark-ff", "base64 0.22.1", @@ -4541,20 +4475,6 @@ dependencies = [ "redox_syscall 0.7.0", ] -[[package]] -name = "librocksdb-sys" -version = "0.18.0+10.7.5" -source = "git+https://github.com/QuantumExplorer/rust-rocksdb.git?rev=52772eea7bcd214d1d07d80aa538b1d24e5015b7#52772eea7bcd214d1d07d80aa538b1d24e5015b7" -dependencies = [ - "bindgen 0.72.1", - "bzip2-sys", - "cc", - "libc", - "libz-sys", - "lz4-sys", - "zstd-sys", -] - [[package]] name = "libsqlite3-sys" version = "0.35.0" @@ -4566,17 +4486,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "libz-sys" -version = "1.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -4628,16 +4537,6 @@ dependencies = [ "hashbrown 0.16.1", ] -[[package]] -name = "lz4-sys" -version = "1.11.1+lz4-1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "malloc_buf" version = "0.0.6" @@ -4836,7 +4735,7 @@ dependencies = [ "once_cell", "rustc-hash 1.1.0", "spirv", - "strum 0.26.3", + "strum", "thiserror 2.0.18", "unicode-ident", ] @@ -6352,15 +6251,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rocksdb" -version = "0.24.0" -source = "git+https://github.com/QuantumExplorer/rust-rocksdb.git?rev=52772eea7bcd214d1d07d80aa538b1d24e5015b7#52772eea7bcd214d1d07d80aa538b1d24e5015b7" -dependencies = [ - "libc", - "librocksdb-sys", -] - [[package]] name = "ron" version = "0.10.1" @@ -6412,7 +6302,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94ea852806513d6f5fd7750423300375bc8481a18ed033756c1a836257893a30" dependencies = [ - "bindgen 0.65.1", + "bindgen", "cc", "libc", ] @@ -7122,16 +7012,7 @@ version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", + "strum_macros", ] [[package]] @@ -7147,18 +7028,6 @@ dependencies = [ "syn 2.0.114", ] -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "subtle" version = "2.6.1" @@ -9920,16 +9789,6 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "zune-core" version = "0.4.12" diff --git a/Cargo.toml b/Cargo.toml index f535fb180..934cb02f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ dash-sdk = { git = "https://github.com/dashpay/platform", rev = "98a0ebeca4e6a9a "core_rpc_client", "core_spv", ] } -grovestark = { git = "https://www.github.com/dashpay/grovestark", rev = "a70bdb1adac080d4f1dc10f2f4480d9dacd0f0da" } +grovestark = { git = "https://www.github.com/dashpay/grovestark", rev = "ee2ed062a14a929b3e1297584fdb01fea598e9b2" } rayon = "1.8" thiserror = "2.0.12" serde = "1.0.219" From 4fd1be3fad44bebbc459a46a76491908e8232c1b Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:26:33 +0100 Subject: [PATCH 7/9] chore: fmt --- build.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.rs b/build.rs index 229d4c2eb..d5c18016c 100644 --- a/build.rs +++ b/build.rs @@ -74,7 +74,9 @@ fn resolve_ar(target: &str) -> Option { fn resolve_tool(env_keys: &[String], candidates: &[&str]) -> Option { for key in env_keys { - if let Ok(cmd) = env::var(key) && is_available(&cmd) { + if let Ok(cmd) = env::var(key) + && is_available(&cmd) + { return Some(cmd); } } From ab6dad3d16597742e0e215ece7f8336cefd848b5 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 19:32:16 +0100 Subject: [PATCH 8/9] fix: don't open console window on windows --- src/backend_task/core/start_dash_qt.rs | 2 +- src/main.rs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend_task/core/start_dash_qt.rs b/src/backend_task/core/start_dash_qt.rs index 08d54f8f9..b8b4fc825 100644 --- a/src/backend_task/core/start_dash_qt.rs +++ b/src/backend_task/core/start_dash_qt.rs @@ -133,7 +133,7 @@ fn signal_term(child: &Child) -> Result<(), String> { } #[cfg(windows)] -fn signal_term(child: &Child) -> Result<(), String> { +fn signal_term(_child: &Child) -> Result<(), String> { // TODO: Implement graceful termination for Dash-Qt on Windows. tracing::warn!( "SIGTERM signal is not supported on Windows. Dash-Qt process will not be gracefully terminated." diff --git a/src/main.rs b/src/main.rs index 127217a48..0dae520d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![cfg_attr(target_os = "windows", windows_subsystem = "windows")] + use dash_evo_tool::*; use crate::app_dir::{app_user_data_dir_path, create_app_user_data_directory_if_not_exists}; From c74897b98923aa30b92329c29616a200f74bcc01 Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Feb 2026 20:07:10 +0100 Subject: [PATCH 9/9] build: grovestark recent commit --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7ff72dc2..938872ea0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3549,7 +3549,7 @@ dependencies = [ [[package]] name = "grovestark" version = "0.1.0" -source = "git+https://www.github.com/dashpay/grovestark?rev=ee2ed062a14a929b3e1297584fdb01fea598e9b2#ee2ed062a14a929b3e1297584fdb01fea598e9b2" +source = "git+https://www.github.com/dashpay/grovestark?rev=5b9e289cca54c79b1305d5f4f40bf1148f1eb0e3#5b9e289cca54c79b1305d5f4f40bf1148f1eb0e3" dependencies = [ "ark-ff", "base64 0.22.1", diff --git a/Cargo.toml b/Cargo.toml index 934cb02f3..e94de8b28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ dash-sdk = { git = "https://github.com/dashpay/platform", rev = "98a0ebeca4e6a9a "core_rpc_client", "core_spv", ] } -grovestark = { git = "https://www.github.com/dashpay/grovestark", rev = "ee2ed062a14a929b3e1297584fdb01fea598e9b2" } +grovestark = { git = "https://www.github.com/dashpay/grovestark", rev = "5b9e289cca54c79b1305d5f4f40bf1148f1eb0e3" } rayon = "1.8" thiserror = "2.0.12" serde = "1.0.219"