diff --git a/res/ObsidianDragon.manifest b/res/ObsidianDragon.manifest
index 2952366..4571d1f 100644
--- a/res/ObsidianDragon.manifest
+++ b/res/ObsidianDragon.manifest
@@ -5,7 +5,7 @@
diff --git a/src/app.cpp b/src/app.cpp
index d5d3a8b..a8b695b 100644
--- a/src/app.cpp
+++ b/src/app.cpp
@@ -1461,8 +1461,35 @@ void App::renderStatusBar()
int chainTip = state_.longestchain > 0 ? state_.longestchain : state_.sync.headers;
int blocksLeft = chainTip - state_.sync.blocks;
if (blocksLeft < 0) blocksLeft = 0;
- ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left)",
- state_.sync.verification_progress * 100.0, blocksLeft);
+
+ // Calculate sync speed (blocks/sec) using a smoothed rolling average
+ static int s_prev_blocks = 0;
+ static double s_prev_time = 0.0;
+ static double s_blocks_per_sec = 0.0;
+ double now = ImGui::GetTime();
+ if (s_prev_time > 0.0 && state_.sync.blocks > s_prev_blocks) {
+ double dt = now - s_prev_time;
+ if (dt > 0.5) {
+ double raw = (state_.sync.blocks - s_prev_blocks) / dt;
+ // Exponential smoothing (alpha ~0.3 per update)
+ s_blocks_per_sec = s_blocks_per_sec > 0.0
+ ? s_blocks_per_sec * 0.7 + raw * 0.3
+ : raw;
+ s_prev_blocks = state_.sync.blocks;
+ s_prev_time = now;
+ }
+ } else {
+ s_prev_blocks = state_.sync.blocks;
+ s_prev_time = now;
+ }
+
+ if (s_blocks_per_sec > 0.1) {
+ ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left, %.0f blk/s)",
+ state_.sync.verification_progress * 100.0, blocksLeft, s_blocks_per_sec);
+ } else {
+ ImGui::TextColored(ImVec4(1.0f, 0.8f, 0.0f, 1.0f), "Syncing %.1f%% (%d left)",
+ state_.sync.verification_progress * 100.0, blocksLeft);
+ }
} else if (state_.connected) {
ImGui::Text("Peers: %zu", state_.peers.size());
}
@@ -2113,6 +2140,7 @@ bool App::startEmbeddedDaemon()
// Sync debug logging categories from user settings
if (settings_) {
embedded_daemon_->setDebugCategories(settings_->getDebugCategories());
+ embedded_daemon_->setMaxConnections(settings_->getMaxConnections());
}
return embedded_daemon_->start();
diff --git a/src/config/settings.cpp b/src/config/settings.cpp
index bf733d7..f6f1254 100644
--- a/src/config/settings.cpp
+++ b/src/config/settings.cpp
@@ -132,6 +132,7 @@ bool Settings::load(const std::string& path)
if (j.contains("pin_enabled")) pin_enabled_ = j["pin_enabled"].get();
if (j.contains("keep_daemon_running")) keep_daemon_running_ = j["keep_daemon_running"].get();
if (j.contains("stop_external_daemon")) stop_external_daemon_ = j["stop_external_daemon"].get();
+ if (j.contains("max_connections")) max_connections_ = j["max_connections"].get();
if (j.contains("verbose_logging")) verbose_logging_ = j["verbose_logging"].get();
if (j.contains("debug_categories") && j["debug_categories"].is_array()) {
debug_categories_.clear();
@@ -235,6 +236,7 @@ bool Settings::save(const std::string& path)
j["pin_enabled"] = pin_enabled_;
j["keep_daemon_running"] = keep_daemon_running_;
j["stop_external_daemon"] = stop_external_daemon_;
+ j["max_connections"] = max_connections_;
j["verbose_logging"] = verbose_logging_;
j["debug_categories"] = json::array();
for (const auto& cat : debug_categories_)
diff --git a/src/config/settings.h b/src/config/settings.h
index 392be39..b778ae2 100644
--- a/src/config/settings.h
+++ b/src/config/settings.h
@@ -165,6 +165,10 @@ public:
bool getStopExternalDaemon() const { return stop_external_daemon_; }
void setStopExternalDaemon(bool v) { stop_external_daemon_ = v; }
+ // Daemon — maximum peer connections (0 = daemon default)
+ int getMaxConnections() const { return max_connections_; }
+ void setMaxConnections(int v) { max_connections_ = std::max(0, v); }
+
// Verbose diagnostic logging (connection attempts, daemon state, port owner, etc.)
bool getVerboseLogging() const { return verbose_logging_; }
void setVerboseLogging(bool v) { verbose_logging_ = v; }
@@ -303,6 +307,7 @@ private:
bool pin_enabled_ = false;
bool keep_daemon_running_ = false;
bool stop_external_daemon_ = false;
+ int max_connections_ = 0; // 0 = daemon default
bool verbose_logging_ = false;
std::set debug_categories_;
bool theme_effects_enabled_ = true;
diff --git a/src/daemon/embedded_daemon.cpp b/src/daemon/embedded_daemon.cpp
index db3831a..b2d08d3 100644
--- a/src/daemon/embedded_daemon.cpp
+++ b/src/daemon/embedded_daemon.cpp
@@ -205,7 +205,11 @@ std::vector EmbeddedDaemon::getChainParams()
"-ac_reward=300000000",
"-ac_blocktime=36",
"-ac_private=1",
- "-addnode=176.126.87.241",
+ "-addnode=node.dragonx.is",
+ "-addnode=node1.dragonx.is",
+ "-addnode=node2.dragonx.is",
+ "-addnode=node3.dragonx.is",
+ "-addnode=node4.dragonx.is",
"-experimentalfeatures",
"-developerencryptwallet",
dbcache_arg
@@ -473,6 +477,11 @@ bool EmbeddedDaemon::start(const std::string& binary_path)
args.push_back("-debug=" + cat);
}
+ // Append max connections if configured (0 = daemon default)
+ if (max_connections_ > 0) {
+ args.push_back("-maxconnections=" + std::to_string(max_connections_));
+ }
+
// Add -rescan flag if requested (one-shot)
if (rescan_on_next_start_.exchange(false)) {
DEBUG_LOGF("[INFO] Adding -rescan flag for blockchain rescan\n");
diff --git a/src/daemon/embedded_daemon.h b/src/daemon/embedded_daemon.h
index c993ba4..ce9d157 100644
--- a/src/daemon/embedded_daemon.h
+++ b/src/daemon/embedded_daemon.h
@@ -152,6 +152,11 @@ public:
void setDebugCategories(const std::set& cats) { debug_categories_ = cats; }
const std::set& getDebugCategories() const { return debug_categories_; }
+ /**
+ * @brief Set maximum peer connections (0 = use daemon default)
+ */
+ void setMaxConnections(int v) { max_connections_ = v; }
+
/**
* @brief Request a blockchain rescan on the next daemon start
*/
@@ -194,6 +199,7 @@ private:
std::thread monitor_thread_;
std::atomic should_stop_{false};
std::set debug_categories_;
+ int max_connections_ = 0; // 0 = daemon default
std::atomic crash_count_{0}; // consecutive crash counter
std::atomic rescan_on_next_start_{false}; // -rescan flag for next start
};
diff --git a/src/rpc/connection.cpp b/src/rpc/connection.cpp
index 2204f08..c652bc8 100644
--- a/src/rpc/connection.cpp
+++ b/src/rpc/connection.cpp
@@ -234,8 +234,11 @@ bool Connection::createDefaultConfig(const std::string& path)
file << "exportdir=" << dataDir << "\n";
file << "experimentalfeatures=1\n";
file << "developerencryptwallet=1\n";
- file << "addnode=195.201.20.230\n";
- file << "addnode=195.201.137.219\n";
+ file << "addnode=node.dragonx.is\n";
+ file << "addnode=node1.dragonx.is\n";
+ file << "addnode=node2.dragonx.is\n";
+ file << "addnode=node3.dragonx.is\n";
+ file << "addnode=node4.dragonx.is\n";
file.close();