fix: Windows identity, async address creation, mining UI, and chart artifacts

Windows identity:
- Add VERSIONINFO resource (.rc) with ObsidianDragon file description
- Embed application manifest for DPI awareness and shell identity
- Patch libwinpthread/libpthread to remove competing VERSIONINFO
- Set AppUserModelID and HWND property store to override Task Manager cache
- Link patched pthread libs to eliminate "POSIX WinThreads" description

Address creation (+New button):
- Move z_getnewaddress/getnewaddress off UI thread to async worker
- Inject new address into state immediately for instant UI selection
- Trigger background refresh for balance updates

Mining tab:
- Add pool mining dropdown with saved URLs/workers and bookmarks
- Add solo mining log panel from daemon output with chart/log toggle
- Fix toggle button cursor (render after InputTextMultiline)
- Auto-restart miner on pool config change
- Migrate default pool URL to include stratum port

Transactions:
- Sort pending (0-conf) transactions to top of history
- Fall back to timereceived when timestamp is missing

Shutdown:
- Replace blocking sleep_for calls with 100ms polling loops
- Check shutting_down_ flag throughout daemon restart/bootstrap flows
- Reduce daemon stop timeout from 30s to 10s

Other:
- Fix market chart fill artifact (single concave polygon vs per-segment quads)
- Add bootstrap checksum verification state display
- Rename daemon client identifier to ObsidianDragon
This commit is contained in:
dan_s
2026-03-05 22:43:27 -06:00
parent 4b16a2a2c4
commit 653a90de62
20 changed files with 842 additions and 116 deletions

View File

@@ -512,7 +512,7 @@ std::string Bootstrap::computeSHA256(const std::string& filePath) {
snprintf(msg, sizeof(msg), "Verifying SHA-256... %.0f%% (%s / %s)",
pct, formatSize((double)processed).c_str(),
formatSize((double)fileSize).c_str());
setProgress(State::Downloading, msg, (double)processed, (double)fileSize);
setProgress(State::Verifying, msg, (double)processed, (double)fileSize);
}
}
fclose(fp);
@@ -643,7 +643,7 @@ std::string Bootstrap::computeMD5(const std::string& filePath) {
snprintf(msg, sizeof(msg), "Verifying MD5... %.0f%% (%s / %s)",
pct, formatSize((double)processed).c_str(),
formatSize((double)fileSize).c_str());
setProgress(State::Downloading, msg, (double)processed, (double)fileSize);
setProgress(State::Verifying, msg, (double)processed, (double)fileSize);
}
}
fclose(fp);
@@ -663,7 +663,7 @@ std::string Bootstrap::computeMD5(const std::string& filePath) {
// ---------------------------------------------------------------------------
bool Bootstrap::verifyChecksums(const std::string& zipPath, const std::string& baseUrl) {
setProgress(State::Downloading, "Downloading checksums...");
setProgress(State::Verifying, "Downloading checksums...");
std::string sha256Url = baseUrl + "/" + kZipName + ".sha256";
std::string md5Url = baseUrl + "/" + kZipName + ".md5";
@@ -684,7 +684,7 @@ bool Bootstrap::verifyChecksums(const std::string& zipPath, const std::string& b
// --- SHA-256 ---
if (haveSHA256) {
setProgress(State::Downloading, "Verifying SHA-256...");
setProgress(State::Verifying, "Verifying SHA-256...");
std::string expected = parseChecksumFile(sha256Content);
std::string actual = computeSHA256(zipPath);
@@ -712,7 +712,7 @@ bool Bootstrap::verifyChecksums(const std::string& zipPath, const std::string& b
// --- MD5 ---
if (haveMD5) {
setProgress(State::Downloading, "Verifying MD5...");
setProgress(State::Verifying, "Verifying MD5...");
std::string expected = parseChecksumFile(md5Content);
std::string actual = computeMD5(zipPath);
@@ -738,7 +738,7 @@ bool Bootstrap::verifyChecksums(const std::string& zipPath, const std::string& b
DEBUG_LOGF("[Bootstrap] MD5 verified: %s\n", actual.c_str());
}
setProgress(State::Downloading, "Checksums verified \xe2\x9c\x93");
setProgress(State::Verifying, "Checksums verified \xe2\x9c\x93");
return true;
}

View File

@@ -27,6 +27,7 @@ public:
enum class State {
Idle,
Downloading,
Verifying,
Extracting,
Completed,
Failed