Skip to content

Commit 2c6d9a1

Browse files
committed
Add SPV sync progress with ETA to loading page
1 parent a54d5fb commit 2c6d9a1

4 files changed

Lines changed: 50 additions & 3 deletions

File tree

src/c2pool/c2pool_refactored.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2993,6 +2993,22 @@ int main(int argc, char* argv[]) {
29932993
return result;
29942994
});
29952995

2996+
// SPV sync progress for loading page
2997+
web_server.get_mining_interface()->set_spv_progress_fn(
2998+
[&ltc_utxo_cache, &embedded_chain]() {
2999+
nlohmann::json r;
3000+
int ltc_connected = ltc_utxo_cache ? static_cast<int>(ltc_utxo_cache->blocks_connected()) : 0;
3001+
int ltc_need = static_cast<int>(core::coin::LTC_MINING_GATE_DEPTH);
3002+
int ltc_height = embedded_chain ? static_cast<int>(embedded_chain->height()) : 0;
3003+
r["ltc_blocks"] = ltc_connected;
3004+
r["ltc_need"] = ltc_need;
3005+
r["ltc_height"] = ltc_height;
3006+
// DOGE UTXO is initialized after LTC — show 0 until wired
3007+
r["doge_blocks"] = 0;
3008+
r["doge_need"] = static_cast<int>(core::coin::DOGE_MINING_GATE_DEPTH);
3009+
return r;
3010+
});
3011+
29963012
// Wire per-share window data for the defragmenter grid
29973013
web_server.get_mining_interface()->set_sharechain_window_fn([&p2p_node, &web_server]() {
29983014
nlohmann::json result;

src/core/web_server.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4387,6 +4387,12 @@ nlohmann::json MiningInterface::rest_sync_status()
43874387
std::chrono::duration_cast<std::chrono::seconds>(
43884388
std::chrono::steady_clock::now() - m_start_time).count());
43894389

4390+
// SPV sync progress
4391+
if (m_spv_progress_fn) {
4392+
auto spv = m_spv_progress_fn();
4393+
result["spv"] = spv;
4394+
}
4395+
43904396
return result;
43914397
}
43924398

src/core/web_server.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,10 @@ class MiningInterface : public jsonrpccxx::JsonRpc2Server
495495
void set_local_hashrate(double hr) { m_cached_pool_hashrate = hr; }
496496
double get_network_difficulty() const { return m_network_difficulty.load(); }
497497

498+
// SPV sync progress callback — returns {ltc_blocks, ltc_need, doge_blocks, doge_need}
499+
using spv_progress_fn_t = std::function<nlohmann::json()>;
500+
void set_spv_progress_fn(spv_progress_fn_t fn) { m_spv_progress_fn = std::move(fn); }
501+
498502
// Sharechain stats callback — returns live tracker data for the /sharechain/stats endpoint
499503
using sharechain_stats_fn_t = std::function<nlohmann::json()>;
500504
void set_sharechain_stats_fn(sharechain_stats_fn_t fn) { m_sharechain_stats_fn = thread_safe_wrap(std::move(fn)); }
@@ -899,6 +903,7 @@ class MiningInterface : public jsonrpccxx::JsonRpc2Server
899903

900904
// Sharechain stats callback
901905
sharechain_stats_fn_t m_sharechain_stats_fn;
906+
spv_progress_fn_t m_spv_progress_fn;
902907
sharechain_window_fn_t m_sharechain_window_fn;
903908
sharechain_tip_fn_t m_sharechain_tip_fn;
904909
sharechain_delta_fn_t m_sharechain_delta_fn;

web-static/loading.html

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ <h1>c2pool</h1>
3737
<div class="row"><span class="label">Sharechain</span><span class="val" id="d-shares">...</span></div>
3838
<div class="row"><span class="label">Verified</span><span class="val" id="d-verified">...</span></div>
3939
<div class="row"><span class="label">Best share</span><span class="val" id="d-best">...</span></div>
40-
<div class="row"><span class="label">SPV nodes</span><span class="val" id="d-work">...</span></div>
40+
<div class="row"><span class="label">LTC SPV</span><span class="val" id="d-ltc-spv">...</span></div>
41+
<div class="row"><span class="label">DOGE SPV</span><span class="val" id="d-doge-spv">...</span></div>
4142
<div class="row"><span class="label">Uptime</span><span class="val" id="d-uptime">...</span></div>
4243
</div>
4344
<div class="note">This page auto-refreshes. You will be redirected to the dashboard when ready.</div>
@@ -60,8 +61,27 @@ <h1>c2pool</h1>
6061
// Dashboard is truly ready when currency_info has real data
6162
var dashReady = ci.block_value != null && ci.block_value > 0
6263
&& ci.pool_hash_rate != null && d.verified_size > 0;
63-
document.getElementById('d-work').textContent = dashReady ? 'ready' : 'syncing...';
64-
document.getElementById('d-work').className = 'val ' + (dashReady ? 'ok' : 'wait');
64+
// SPV progress with ETA
65+
if (d.spv) {
66+
var ltcDone = d.spv.ltc_blocks >= d.spv.ltc_need;
67+
var ltcTxt = ltcDone ? 'ready' : d.spv.ltc_blocks + '/' + d.spv.ltc_need;
68+
if (!ltcDone && d.spv.ltc_blocks > 1 && d.uptime_seconds > 10) {
69+
var rate = d.spv.ltc_blocks / d.uptime_seconds;
70+
var remain = Math.ceil((d.spv.ltc_need - d.spv.ltc_blocks) / Math.max(rate, 0.01));
71+
ltcTxt += ' (~' + (remain > 60 ? Math.ceil(remain/60) + 'min' : remain + 's') + ')';
72+
}
73+
document.getElementById('d-ltc-spv').textContent = ltcTxt;
74+
document.getElementById('d-ltc-spv').className = 'val ' + (ltcDone ? 'ok' : 'wait');
75+
var dogeDone = d.spv.doge_blocks >= d.spv.doge_need;
76+
var dogeTxt = dogeDone ? 'ready' : d.spv.doge_blocks + '/' + d.spv.doge_need;
77+
if (!dogeDone && d.spv.doge_blocks > 1 && d.uptime_seconds > 10) {
78+
var dr = d.spv.doge_blocks / d.uptime_seconds;
79+
var drem = Math.ceil((d.spv.doge_need - d.spv.doge_blocks) / Math.max(dr, 0.01));
80+
dogeTxt += ' (~' + (drem > 60 ? Math.ceil(drem/60) + 'min' : drem + 's') + ')';
81+
}
82+
document.getElementById('d-doge-spv').textContent = dogeTxt;
83+
document.getElementById('d-doge-spv').className = 'val ' + (dogeDone ? 'ok' : 'wait');
84+
}
6585
var m = Math.floor((d.uptime_seconds || 0) / 60);
6686
var s = (d.uptime_seconds || 0) % 60;
6787
document.getElementById('d-uptime').textContent = m + 'm ' + s + 's';

0 commit comments

Comments
 (0)