BIP-110 Signaling Monitor — Bitcoin Magazine :root{ --bg:#0a0a0b; --bg-2:#141415; --bg-3:#1c1c1e; --bg-4:#242426; --border:#2b2b2d; --border-2:#38373a; --text:#f3efe8; --text-dim:#a39d92; --text-faint:#6d675f; --accent:#ff9500; --accent-2:#ffb454; --accent-glow:#ff9500; --accent-dim:#ff9500; --serif: Georgia, "Iowan Old Style", "Palatino Linotype", Palatino, serif; --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; --mono: "SF Mono", "Berkeley Mono", ui-monospace, Menlo, Consolas, monospace; } *{box-sizing:border-box;} html,body{margin:0;padding:0;} body{ background:var(--bg); color:var(--text); -webkit-font-smoothing:antialiased; line-height:1.5; } img,svg{max-width:100%;} .wrap{max-width:1080px;margin:0 auto;padding:0 28px;} a{color:var(--accent-2);text-decoration:none;} a:hover{text-decoration:underline;} a:focus-visible,button:focus-visible{outline:2px solid var(--accent-2);outline-offset:2px;} /* ---------- masthead ---------- */ .masthead{ background: radial-gradient(ellipse 900px 400px at 50% -120px, var(--accent-dim), transparent 70%), var(--bg); } .masthead-inner{ display:flex;align-items:center;justify-content:space-between; padding:22px 0; border-bottom:1px solid var(--border); } .brand{ font-weight:700; font-size:20px; letter-spacing:0.02em; text-transform:uppercase; color:var(--text); } .brand span{color:var(--accent);} .kicker{ font-size:11px; letter-spacing:0.14em; text-transform:uppercase; color:var(--text-dim); display:flex;align-items:center;gap:8px; } .live-dot{ width:7px;height:7px;border-radius:50%; background:var(--accent); box-shadow:0 0 0 0 var(--accent-glow); animation:pulse 2.2s infinite; } @media (prefers-reduced-motion: reduce){ .live-dot{animation:none;} } @keyframes pulse{ 0%{box-shadow:0 0 0 0 var(--accent-glow);} 70%{box-shadow:0 0 0 7px transparent;} 100%{box-shadow:0 0 0 0 transparent;} } /* ---------- hero ---------- */ .hero{padding:56px 0 44px;text-align:center;} .hero-eyebrow{ font-size:12px;letter-spacing:0.18em;text-transform:uppercase; color:var(--accent-2);margin:0 0 14px; } .hero h1{ color: #fff; font-weight:700; font-size:clamp(30px,5vw,52px); line-height:1.08; margin:0 0 12px; text-wrap:balance; } .hero h1 em{color:var(--accent);font-style:normal;} .hero p.sub{ max-width:620px;margin:0 auto 40px; color:var(--text-dim); font-size:16px; } .countdown-label{font-size:11px;letter-spacing:0.16em;text-transform:uppercase; color:var(--text-faint);margin-bottom:14px; } .countdown{ display:flex;justify-content:center;gap:clamp(10px,3vw,28px); margin:0 auto 10px; } .cd-unit{min-width:78px;} .cd-num{ font-family:var(--mono); font-weight:700; font-size:clamp(38px,8vw,74px); line-height:1; font-variant-numeric:tabular-nums; color:var(--text); letter-spacing:-0.02em; } .cd-num.accent{color:var(--accent);} .cd-unit-label{font-size:10px;letter-spacing:0.14em;text-transform:uppercase; color:var(--text-faint);margin-top:4px; } .countdown-note{ font-size:12.5px;color:var(--text-faint);max-width:480px;margin:14px auto 0; } .countdown-note b{color:var(--text-dim);font-weight:600;} /* ---------- stat tiles ---------- */ .stats{ display:grid;grid-template-columns:repeat(4,1fr);gap:1px; background:var(--border); border:1px solid var(--border); border-radius:10px; overflow:hidden; margin-top:8px; } .stat{ background:var(--bg-2); padding:22px 20px; } .stat-label{font-size:10.5px;letter-spacing:0.1em;text-transform:uppercase; color:var(--text-faint);margin-bottom:10px; } .stat-value{font-weight:700;font-size:28px;color:var(--text); font-variant-numeric:tabular-nums; } .stat-value.accent{color:var(--accent);} .stat-sub{font-size:12px;color:var(--text-dim);margin-top:6px;} @media (max-width:720px){ .stats{grid-template-columns:repeat(2,1fr);} } /* ---------- sections ---------- */ section{padding:52px 0;border-bottom:1px solid var(--border);} .section-head{margin-bottom:28px;} .section-eyebrow{font-size:11px;letter-spacing:0.16em;text-transform:uppercase; color:var(--accent-2);margin:0 0 8px; } .section-head h2{font-size:clamp(22px,3vw,30px);margin:0;font-weight:700; color: #fff; } .section-head p{color:var(--text-dim);max-width:640px;margin:10px 0 0;font-size:15px;} /* ---------- panels / charts ---------- */ .panel-grid{display:grid;grid-template-columns:1.3fr 1fr;gap:20px;align-items:stretch;} @media (max-width:820px){.panel-grid{grid-template-columns:1fr;}} .panel{ background:var(--bg-2);border:1px solid var(--border);border-radius:10px; padding:22px 22px 18px; } .panel-title{ display:flex;justify-content:space-between;align-items:baseline;margin-bottom:16px; } .panel-title h3{font-size:14px;margin:0;font-weight:600;color:var(--text);} .panel-title span{font-size:11px;color:var(--text-faint);} .chart-svg{width:100%;height:auto;display:block;overflow:visible;} .grid-line{stroke:var(--border-2);stroke-width:1;} .axis-label{fill:var(--text-faint);font-size:9.5px;} .trend-area{fill:url(#areaGrad);} .trend-line{fill:none;stroke:var(--accent);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;} .trend-dot{fill:var(--bg-2);stroke:var(--accent);stroke-width:2;} .trend-dot.current{fill:var(--accent);stroke:var(--accent-2);stroke-width:2;} .hit-area{fill:transparent;cursor:crosshair;} .tooltip{ position:absolute;pointer-events:none; background:var(--bg-4);border:1px solid var(--border-2);border-radius:6px; padding:8px 10px;font-size:11.5px;color:var(--text);white-space:nowrap; transform:translate(-50%,-115%); opacity:0;transition:opacity 0.1s; z-index:5; } .tooltip.show{opacity:1;} .tooltip .t-pct{color:var(--accent-2);font-weight:700;} .chart-wrap{position:relative;} .crosshair{stroke:var(--border-2);stroke-width:1;stroke-dasharray:2 3;opacity:0;} .crosshair.show{opacity:1;} /* threshold meter */ .meter-value-row{display:flex;align-items:baseline;gap:10px;margin-bottom:4px;} .meter-big{font-weight:700;font-size:40px;color:var(--accent);font-variant-numeric:tabular-nums;} .meter-goal{font-size:12.5px;color:var(--text-faint);} .meter-track{ position:relative;height:14px;border-radius:7px;background:var(--bg-3); border:1px solid var(--border-2);margin:18px 0 8px;overflow:visible; } .meter-fill{ position:absolute;left:0;top:0;height:100%;border-radius:7px; background:linear-gradient(90deg,var(--accent-2),var(--accent)); box-shadow:0 0 12px var(--accent-glow); } .meter-threshold{ position:absolute;top:-6px;bottom:-6px;width:2px;background:var(--text-dim); } .meter-threshold .th-label{ position:absolute;top:-22px;left:50%;transform:translateX(-50%);font-size:10px;color:var(--text-dim);white-space:nowrap; } .meter-scale{display:flex;justify-content:space-between;font-size:10px;color:var(--text-faint);margin-top:2px;} .meter-note{font-size:12.5px;color:var(--text-dim);margin-top:26px;line-height:1.55;} /* period progress ring */ .period-row{display:flex;align-items:center;gap:20px;margin-top:6px;} .period-ring{flex:none;} .period-copy{font-size:12.5px;color:var(--text-dim);line-height:1.6;} .period-copy b{color:var(--text);} /* ---------- explainer ---------- */ .spec-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:6px;} @media (max-width:820px){.spec-grid{grid-template-columns:repeat(2,1fr);}} .spec-card{ background:var(--bg-2);border:1px solid var(--border);border-radius:10px;padding:18px; } .spec-num{color:var(--accent);font-weight:700;font-size:20px;margin-bottom:8px;} .spec-card p{font-size:12.8px;color:var(--text-dim);margin:0;line-height:1.55;} .byline{ display:flex;gap:28px;flex-wrap:wrap;margin-top:24px;padding-top:20px;border-top:1px solid var(--border); } .byline-item{font-size:12.5px;color:var(--text-dim);} .byline-item b{display:block;color:var(--text);font-size:13px;margin-bottom:2px;} /* ---------- debate ---------- */ .debate-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-top:6px;} @media (max-width:820px){.debate-grid{grid-template-columns:1fr;}} .debate-col{ background:var(--bg-2);border:1px solid var(--border);border-radius:10px;padding:24px; border-top:3px solid var(--border-2); } .debate-col.support{border-top-color:var(--accent-2);} .debate-col.critic{border-top-color:var(--text-dim);} .debate-head{font-size:11px;letter-spacing:0.12em;text-transform:uppercase; color:var(--text-faint);margin-bottom:14px; } .debate-col.support .debate-head{color:var(--accent-2);} blockquote{font-size:16.5px;line-height:1.5;color:var(--text); margin:0 0 12px;padding-left:16px;border-left:2px solid var(--border-2); } .debate-col.support blockquote{border-left-color:var(--accent);} .debate-cite{font-size:12px;color:var(--text-faint);margin-bottom:20px;} .debate-col p.note{font-size:13px;color:var(--text-dim);line-height:1.6;margin:0;} /* ---------- timeline ---------- */ .timeline{display:flex;position:relative;margin-top:36px;padding-top:6px;} .timeline::before{ content:"";position:absolute;top:9px;left:0;right:0;height:2px;background:var(--border-2); } .tl-node{flex:1;position:relative;padding-right:16px;} .tl-node:last-child{flex:0 0 auto;padding-right:0;text-align:right;} .tl-dot{width:10px;height:10px;border-radius:50%;background:var(--bg);border:2px solid var(--border-2);margin-bottom:14px;} .tl-node.active .tl-dot{border-color:var(--accent);background:var(--accent);box-shadow:0 0 10px var(--accent-glow);} .tl-date{font-size:11px;color:var(--accent-2);margin-bottom:4px;} .tl-copy{font-size:12.8px;color:var(--text-dim);max-width:220px;line-height:1.5;} /* ---------- featured article ---------- */ .featured-article{ background:var(--bg-2);border:1px solid var(--border);border-radius:10px; overflow:hidden;display:grid;grid-template-columns:1fr 1fr;align-items:stretch; } @media (max-width:820px){.featured-article{grid-template-columns:1fr;}} .featured-media{display:block;background:var(--bg-3);} .featured-media img{ width:100%;height:100%;min-height:220px;object-fit:cover;display:block; } .featured-body{padding:28px 30px;display:flex;flex-direction:column;justify-content:center;} .featured-cat{ font-size:11px;letter-spacing:0.12em;text-transform:uppercase;color:var(--accent-2); margin-bottom:12px; } .featured-title{ font-size:clamp(19px,2.4vw,24px);line-height:1.25;font-weight:700;margin:0 0 12px;color:var(--text); } .featured-title a{color:var(--text);} .featured-title a:hover{color:var(--accent-2);text-decoration:none;} .featured-dek{font-size:14px;color:var(--text-dim);line-height:1.6;margin:0 0 18px;} .featured-meta{font-size:12px;color:var(--text-faint);margin-bottom:20px;} .featured-meta b{color:var(--text-dim);font-weight:600;} .featured-cta{ display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:600; color:var(--accent-2);align-self:flex-start; } .featured-cta:hover{text-decoration:none;color:var(--accent);} /* ---------- related coverage ---------- */ .articles-grid{ display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:6px; } @media (max-width:900px){.articles-grid{grid-template-columns:repeat(2,1fr);}} @media (max-width:520px){.articles-grid{grid-template-columns:1fr;}} .article-card{ background:var(--bg-2);border:1px solid var(--border);border-radius:10px; overflow:hidden;display:flex;flex-direction:column; transition:border-color 0.15s; } .article-card:hover{border-color:var(--border-2);} .article-thumb-link{display:block;} .article-thumb{ display:block;width:100%;aspect-ratio:16/9;object-fit:cover;background:var(--bg-3); } .article-body{padding:16px 18px 18px;} .article-cat{ font-size:10px;letter-spacing:0.1em;text-transform:uppercase;color:var(--accent-2); margin-bottom:8px;display:block; } .article-title-link{ font-size:14px;font-weight:600;line-height:1.4;color:var(--text);display:block;margin-bottom:10px; } .article-title-link:hover{color:var(--accent-2);text-decoration:none;} .article-date{font-size:11.5px;color:var(--text-faint);} /* ---------- footer ---------- */ footer{padding:32px 0 48px;} .foot-row{ display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:16px; font-size:12px;color:var(--text-faint); } .foot-row a{color:var(--text-dim);} .disclaimer{margin-top:18px;font-size:11.5px;color:var(--text-faint);max-width:760px;line-height:1.6;}
Currently signaling
2.01%
13 of 646 blocks this period
Activation threshold
55%
of blocks in a period
Blocks remaining
1,371
until block 961,632
Current period
#476
959,616 – 961,631
Signal Strength
Miner signaling, period over period
Each Bitcoin difficulty period spans 2,016 blocks. Signaling has ticked upward as the deadline nears, but stays far below the ~55% needed for lock-in.
Signaling rate by period
Periods 465–476 · % of blocks
Distance to activation
Period #476 · live-est. 0%100%
32%
646 / 2,016 blocks elapsed in period #476.
1,370 blocks remain before the mandatory-signaling period begins at block 961,632.
What It Does
What is BIP-110?
BIP-110, formally the "Reduced Data Temporary Softfork," is a proposed one-year Bitcoin soft fork that would restrict certain methods of adding data to transactions.
34 B
Caps most new transaction outputs at 34 bytes of non-financial data.
83 B
Introduces an 83-byte limit on OP_RETURN outputs.
Taproot
Temporarily limits Taproot features used for "inscriptions" — the technique behind Ordinals-style NFTs on Bitcoin.
1 Year
Framed as temporary — the restrictions would sunset after roughly one year.
AuthorPseudonymous developer "Dathon Ohm"
ContributorInput from Luke Dashjr
Stated goalDefend Bitcoin's role as sound money against blockchain "spam"
The Fight
A proposal that split the community
Supporters see spam mitigation. Critics see a consensus change with real costs — and the disagreement runs all the way up to the BIP's own editor.
Supporters say
Bitcoin's block space should stay reserved for sound money — not used as cheap storage for "spam" data.
— General framing from BIP-110 proponents
The proposal is pitched as a defense of Bitcoin's original purpose, pushing non-financial data — including Ordinals-style inscriptions — out of the base chain.
Critics say
This turns a spam dispute into a consensus change that would invalidate some currently valid, fee-paying transactions.
— Michael Saylor (Strategy), paraphrased
Casa's Jameson Lopp and Strategy's Michael Saylor have both publicly opposed BIP-110. Notably, even the BIP editor who assigned it a number has criticized the proposal despite formally publishing it. — and opponents argue that it won't work to stop all data embedding, while introducing a form of censorship.
Where Things Stand
Governance fight, not (yet) a network split
Miner signaling has stayed far below the ~55% threshold — recently in the low single digits — which keeps the odds of an actual chain split remote as the mandatory signaling window approaches.
Jul 30, 2026
Signaling sits at 2.01% in period #476 — a slow but steady climb from near-zero.
~Aug 9, 2026
Estimated arrival at block 961,632 — the start of the mandatory signaling window.
Ongoing
Lock-in requires ~55% signaling within a period. Until then, this remains a fight over governance and identity, not an imminent split.
Featured Read
What happens when the deadline hits?
Aaron van Wirdum lays out the three most likely paths forward once mandatory signaling begins — from BIP-110 stalling out to a permanent chain split.
Technical Will BIP-110 fail, activate cleanly, or split the chain? A breakdown of what happens under each outcome — including the "wipe out" risk if a minority BIP-110 chain later overtakes the original.
By Aaron van Wirdum · August 7, 2026
Read the full article → Related Coverage
Bitcoin Magazine on BIP-110
(function(){ var ACTIVATION_BLOCK = 961632; // fixed by the BIP-110 proposal text, not returned by the API var API_URL = 'https://bip110monitor.com/api'; // ---- Countdown ---- var target = new Date("2026-08-09T02:00:00Z").getTime(); var els = { d: document.getElementById('cd-d'), h: document.getElementById('cd-h'), m: document.getElementById('cd-m'), s: document.getElementById('cd-s') }; function pad(n){ return String(n).padStart(2,'0'); } function tick(){ var now = Date.now(); var diff = Math.max(0, target - now); var d = Math.floor(diff / 86400000); var h = Math.floor((diff % 86400000) / 3600000); var m = Math.floor((diff % 3600000) / 60000); var s = Math.floor((diff % 60000) / 1000); els.d.textContent = d; els.h.textContent = pad(h); els.m.textContent = pad(m); els.s.textContent = pad(s); } tick(); setInterval(tick, 1000); // ---- Trend chart ---- var data = [ {period:465, range:'937,440-939,455', pct:0.05}, {period:466, range:'939,456-941,471', pct:0.00}, {period:467, range:'941,472-943,487', pct:0.15}, {period:468, range:'943,488-945,503', pct:0.10}, {period:469, range:'945,504-947,519', pct:0.00}, {period:470, range:'947,520-949,535', pct:0.00}, {period:471, range:'949,536-951,551', pct:0.35}, {period:472, range:'951,552-953,567', pct:0.79}, {period:473, range:'953,568-955,583', pct:0.45}, {period:474, range:'955,584-957,599', pct:0.99}, {period:475, range:'957,600-959,615', pct:1.29}, {period:476, range:'959,616-961,631 (in progress)', pct:2.01, current:true} ]; var W = 640, H = 260, padL = 34, padR = 12, padT = 16, padB = 34; var plotW = W - padL - padR, plotH = H - padT - padB; var yMax = 2.5; function xFor(i){ return padL + (i / (data.length - 1)) * plotW; } function yFor(v){ return padT + plotH - (v / yMax) * plotH; } var gridG = document.getElementById('gridLines'); var yLabelsG = document.getElementById('yLabels'); var xLabelsG = document.getElementById('xLabels'); var dotsG = document.getElementById('dots'); var linePath = document.getElementById('linePath'); var areaPath = document.getElementById('areaPath'); function clearChildren(el){ while(el.firstChild) el.removeChild(el.firstChild); } function renderChart(){ clearChildren(gridG); clearChildren(yLabelsG); clearChildren(xLabelsG); clearChildren(dotsG); yMax = 100; var yTicks = [0, yMax/5, yMax*2/5, yMax*3/5, yMax*4/5, yMax]; yTicks.forEach(function(t){ var y = yFor(t); var line = document.createElementNS('http://www.w3.org/2000/svg','line'); line.setAttribute('x1', padL); line.setAttribute('x2', W - padR); line.setAttribute('y1', y); line.setAttribute('y2', y); line.setAttribute('class','grid-line'); gridG.appendChild(line); var label = document.createElementNS('http://www.w3.org/2000/svg','text'); label.setAttribute('x', padL - 8); label.setAttribute('y', y + 3); label.setAttribute('text-anchor','end'); label.setAttribute('class','axis-label'); label.textContent = t.toFixed(1) + '%'; yLabelsG.appendChild(label); }); data.forEach(function(d, i){ if(i % 2 === 0 || d.current){ var label = document.createElementNS('http://www.w3.org/2000/svg','text'); label.setAttribute('x', xFor(i)); label.setAttribute('y', H - 10); label.setAttribute('text-anchor','middle'); label.setAttribute('class','axis-label'); label.textContent = '#' + d.period; xLabelsG.appendChild(label); } }); var thresholdY = yFor(55); var thresholdLine = document.createElementNS('http://www.w3.org/2000/svg','line'); thresholdLine.setAttribute('x1', padL); thresholdLine.setAttribute('x2', W - padR); thresholdLine.setAttribute('y1', thresholdY); thresholdLine.setAttribute('y2', thresholdY); thresholdLine.setAttribute('stroke', '#ff3b30'); thresholdLine.setAttribute('stroke-width', '1.5'); thresholdLine.setAttribute('stroke-dasharray', '4 3'); gridG.appendChild(thresholdLine); var thresholdLabel = document.createElementNS('http://www.w3.org/2000/svg','text'); thresholdLabel.setAttribute('x', W - padR); thresholdLabel.setAttribute('y', thresholdY - 6); thresholdLabel.setAttribute('text-anchor', 'end'); thresholdLabel.setAttribute('fill', '#ff3b30'); thresholdLabel.setAttribute('font-size', '10'); thresholdLabel.textContent = '55% required'; gridG.appendChild(thresholdLabel); var linePts = data.map(function(d,i){ return xFor(i) + ',' + yFor(d.pct); }).join(' L '); linePath.setAttribute('d', 'M ' + linePts); var areaPts = 'M ' + xFor(0) + ',' + yFor(0) + ' L ' + linePts + ' L ' + xFor(data.length-1) + ',' + yFor(0) + ' Z'; areaPath.setAttribute('d', areaPts); data.forEach(function(d,i){ var c = document.createElementNS('http://www.w3.org/2000/svg','circle'); c.setAttribute('cx', xFor(i)); c.setAttribute('cy', yFor(d.pct)); c.setAttribute('r', d.current ? 5 : 3.5); c.setAttribute('class', 'trend-dot' + (d.current ? ' current' : '')); dotsG.appendChild(c); }); var first = data[0], last = data[data.length - 1]; var rangeLabel = document.getElementById('chartPeriodRange'); if(rangeLabel && first && last){ rangeLabel.textContent = 'Periods ' + first.period + '-' + last.period + ' · % of blocks'; } } renderChart(); var tooltip = document.getElementById('tooltip'); var crosshair = document.getElementById('crosshair'); var svg = document.getElementById('trendChart'); var hit = document.getElementById('hitArea'); var wrap = svg.closest('.chart-wrap'); function showTooltip(i, evt){ var d = data[i]; tooltip.innerHTML = '
Period #' + d.period + '
' + '
' + d.range + '
' + '
Signaling: ' + d.pct.toFixed(2) + '%
'; var rect = svg.getBoundingClientRect(); var wrapRect = wrap.getBoundingClientRect(); var scale = rect.width / W; var px = xFor(i) * scale; tooltip.style.left = px + 'px'; tooltip.style.top = (yFor(d.pct) * scale) + 'px'; tooltip.classList.add('show'); crosshair.setAttribute('x1', xFor(i)); crosshair.setAttribute('x2', xFor(i)); crosshair.classList.add('show'); } function hideTooltip(){ tooltip.classList.remove('show'); crosshair.classList.remove('show'); } hit.addEventListener('mousemove', function(evt){ var rect = svg.getBoundingClientRect(); var scale = W / rect.width; var mx = (evt.clientX - rect.left) * scale; var i = Math.round(((mx - padL) / plotW) * (data.length - 1)); i = Math.max(0, Math.min(data.length - 1, i)); showTooltip(i, evt); }); hit.addEventListener('mouseleave', hideTooltip); hit.addEventListener('touchstart', function(evt){ var touch = evt.touches[0]; var rect = svg.getBoundingClientRect(); var scale = W / rect.width; var mx = (touch.clientX - rect.left) * scale; var i = Math.round(((mx - padL) / plotW) * (data.length - 1)); i = Math.max(0, Math.min(data.length - 1, i)); showTooltip(i, evt); }, {passive:true}); // ---- Live data: fetched once on page load. No polling, no interval. ---- function fmt(n){ return Number(n).toLocaleString('en-US'); } function fmtRange(a,b){ return fmt(a) + '-' + fmt(b); } fetch(API_URL, { cache: 'no-store' }) .then(function(res){ if(!res.ok) throw new Error('HTTP ' + res.status); return res.json(); }) .then(function(json){ var blocksRemaining = Math.max(0, ACTIVATION_BLOCK - json.tip); var periodFraction = Math.min(1, json.totalBlocks / 2016); target = Date.now() + blocksRemaining * 10 * 60 * 1000; document.getElementById('stat-pct').textContent = json.pct.toFixed(2) + '%'; document.getElementById('stat-pct-sub').textContent = json.signalingCount + ' of ' + json.totalBlocks + ' blocks this period'; document.getElementById('stat-blocks-remaining').textContent = fmt(blocksRemaining); document.getElementById('stat-period').textContent = '#' + json.periodNum; document.getElementById('stat-period-sub').textContent = fmtRange(json.periodStart, json.periodEnd); document.getElementById('meterPeriodLabel').textContent = 'Period #' + json.periodNum + ' · live-est.'; document.getElementById('meter-pct').textContent = json.pct.toFixed(2) + '%'; document.getElementById('meter-fill').style.width = Math.min(100, json.pct) + '%'; var circumference = 2 * Math.PI * 30; var ring = document.getElementById('periodRingCircle'); ring.setAttribute('stroke-dasharray', circumference.toFixed(1)); ring.setAttribute('stroke-dashoffset', (circumference * (1 - periodFraction)).toFixed(1)); document.getElementById('periodRingText').textContent = Math.round(periodFraction * 100) + '%'; document.getElementById('periodCopyText').innerHTML = '
' + fmt(json.totalBlocks) + ' / 2,016 blocks elapsed in period #' + json.periodNum + '.
' + fmt(blocksRemaining) + ' blocks remain before the mandatory-signaling period begins at block
' + fmt(ACTIVATION_BLOCK) + '.'; data = json.periods.map(function(p){ return { period: p.periodNum, range: fmtRange(p.startBlock, p.endBlock), pct: p.pct }; }); data.push({ period: json.periodNum, range: fmtRange(json.periodStart, json.periodEnd) + ' (in progress)', pct: json.pct, current: true }); renderChart(); }) .catch(function(err){ console.warn('BIP-110 live fetch failed, showing static fallback values:', err); }); })();