Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
214 lines (202 loc) · 25.4 KB
/
Copy pathindex.html
File metadata and controls
214 lines (202 loc) · 25.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' blob: https://cdn.jsdelivr.net/gh/bitcoin-blake/blaketestnode@f1da4a6b64a6a9a6f791d2e5dea8a1c1be81ea09/ https://cdn.jsdelivr.net/gh/sidestr/spec@cec654b7d06907130700fe52c66c3f9d0921495d/ https://cdn.jsdelivr.net/gh/bitcoin-desktop/schema@b8cbf6337c7450fe14ddc5bce00c7280059aab5d/ https://cdn.jsdelivr.net/npm/webtorrent@3.0.21/dist/webtorrent.min.js; worker-src 'self' blob: https://cdn.jsdelivr.net/gh/bitcoin-blake/blaketestnode@f1da4a6b64a6a9a6f791d2e5dea8a1c1be81ea09/ https://cdn.jsdelivr.net/gh/sidestr/spec@cec654b7d06907130700fe52c66c3f9d0921495d/ https://cdn.jsdelivr.net/gh/bitcoin-desktop/schema@b8cbf6337c7450fe14ddc5bce00c7280059aab5d/; connect-src 'self' https: wss:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; object-src 'none'; base-uri 'none'; form-action 'none'">
<title>Bight · txbt4 mempool</title>
<meta name="description" content="A mempool monitor in a browser tab for txbt4, the BLAKE2b testnet4: every transaction shown was validated by the tab's own node, and the next block is the one this tab would build.">
<meta property="og:site_name" content="Bight"><meta property="og:title" content="Bight · a mempool in a tab"><meta property="og:description" content="A mempool monitor that validates every transaction itself, in the browser. The next block on the page is the one this tab would build. BLAKE2b testnet4."><meta property="og:type" content="website"><meta property="og:url" content="https://bitcoin-blake.github.io/bight/"><meta property="og:image" content="https://bitcoin-blake.github.io/bight/og.png"><meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='7' fill='%23171a2b'/%3E%3Cpath d='M6 22c4-10 8-10 10 0s6 10 10 0' fill='none' stroke='%23f0a04b' stroke-width='3' stroke-linecap='round'/%3E%3C/svg%3E">
<script src="theme.js?v=2026-10-01.15"></script>
<style>
:root {
color-scheme: dark;
--bg:#0d0f1a; --panel:#161929; --panel2:#1d2135; --line:#262b42; --grid:#262b42;
--text:#e8eaf2; --mut:#8d92ab; --fieldline:#6b7299;
--acc:#f0a04b; --blue:#5b9def; --purple:#6a5ae0; --green:#3ec28f; --red:#e5605a;
--shadow:0 1px 2px rgba(0,0,0,.25),0 6px 20px rgba(0,0,0,.28);
--shadow-lg:0 12px 40px rgba(0,0,0,.5);
--blksh:inset 0 1px 0 rgba(255,255,255,.13),0 10px 22px rgba(0,0,0,.38);
--blksh-h:inset 0 1px 0 rgba(255,255,255,.16),0 16px 32px rgba(0,0,0,.5);
--rowline:#20243a; --hi:#2a2540;
--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
:root[data-theme="light"] {
color-scheme: light;
--bg:#f2f0ea; --panel:#ffffff; --panel2:#efece4; --line:#e0dbcf; --grid:#e6e1d5;
--text:#22242e; --mut:#5f6272; --fieldline:#857e70;
--acc:#d97f1e; --blue:#2a64b3; --purple:#5a4bd1; --green:#1b9c6b; --red:#cf3d37;
--shadow:0 1px 2px rgba(60,50,30,.06),0 6px 18px rgba(60,50,30,.09);
--shadow-lg:0 14px 44px rgba(60,50,30,.22);
--blksh:inset 0 1px 0 rgba(255,255,255,.2),0 8px 18px rgba(50,40,80,.22);
--blksh-h:inset 0 1px 0 rgba(255,255,255,.24),0 14px 28px rgba(50,40,80,.3);
--rowline:#ece8de; --hi:#f6ecd9;
}
* { box-sizing:border-box }
html,body { margin:0; background:var(--bg); color:var(--text); font:14px/1.5 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif }
a { color:var(--blue) } a:hover { text-decoration:none }
::selection { background:var(--acc); color:#fff }
.mono, .kv .v, td.amt { font-variant-numeric:tabular-nums; font-feature-settings:"tnum" }
* { scrollbar-width:thin; scrollbar-color:var(--line) transparent }
*::-webkit-scrollbar { width:8px; height:8px } *::-webkit-scrollbar-thumb { background:var(--line); border-radius:4px } *::-webkit-scrollbar-track { background:transparent }
:focus-visible { outline:2px solid var(--focus); outline-offset:2px; border-radius:4px }
:root { --focus:#f0a04b } :root[data-theme="light"] { --focus:#9a520a }
.top { display:flex; align-items:center; gap:14px; padding:10px 18px; border-bottom:1px solid var(--line); background:var(--panel); position:sticky; top:0; z-index:5 }
.top .brand { display:flex; align-items:center; gap:10px; font-weight:700; font-size:17.5px; letter-spacing:.2px; margin:0 }
.top .brand span { color:var(--mut); font-weight:400; font-size:12.5px }
/* the logo never shrinks; the subtitle never wraps, and is left out until there is room for it on one line */
.top .brand svg { flex:none } .top .brand span { white-space:nowrap }
@media (max-width:1280px) { .top .brand span { display:none } }
.top .fill { flex:1 }
.pill { display:inline-flex; align-items:center; gap:7px; padding:5px 12px; border-radius:999px; background:var(--panel2); border:1px solid var(--line); font-size:12.5px; white-space:nowrap; font-variant-numeric:tabular-nums }
.pill i { width:8px; height:8px; border-radius:50%; background:var(--mut) }
.pill i.sync { background:var(--acc); box-shadow:0 0 8px var(--acc); animation:tp 1.2s ease-in-out infinite }
.pill i.ok { background:var(--green); box-shadow:0 0 7px var(--green) }
.pill i.bad { background:var(--red); box-shadow:0 0 7px var(--red) }
@keyframes tp { 0%,100% { opacity:1 } 50% { opacity:.3 } }
.search { display:flex; gap:6px }
.search input { width:360px; max-width:38vw; padding:6px 11px; border:1px solid var(--fieldline); border-radius:8px; background:var(--bg); color:var(--text); font:inherit; font-family:var(--mono); font-size:12.5px; transition:border-color .15s,box-shadow .15s }
.search input::placeholder { color:var(--mut) }
.search input:focus-visible { outline:2px solid var(--focus); outline-offset:1px }
.search button, .btn { padding:6px 13px; border:1px solid var(--fieldline); border-radius:8px; background:var(--panel2); color:var(--text); font:inherit; cursor:pointer; transition:border-color .15s,background .15s,transform .08s }
.btn:hover, .search button:hover { border-color:var(--mut) }
.btn:active, .search button:active { transform:translateY(1px) }
.iconbtn { display:inline-flex; align-items:center; justify-content:center; padding:6px 9px }
.iconbtn svg { width:15px; height:15px; display:block }
:root:not([data-theme="light"]) .i-moon { display:none }
:root[data-theme="light"] .i-sun { display:none }
main { padding:18px 18px 64px; max-width:1500px; margin:0 auto }
h1 { font-size:17.5px; margin:0; font-weight:700; display:flex; align-items:center; gap:10px; letter-spacing:.2px }
h2 { font-size:11.5px; text-transform:uppercase; letter-spacing:1px; color:var(--mut); margin:0 0 12px; font-weight:650 }
.blocksrow { display:flex; align-items:stretch; gap:14px; overflow-x:auto; padding:6px 2px 16px; position:relative }
.skip { position:absolute; left:-9999px } .skip:focus { left:auto; right:18px; z-index:6; display:inline-block; padding:4px 10px; border:1px solid var(--fieldline); border-radius:8px; background:var(--panel2); box-shadow:var(--shadow) }
/* on a phone the heading wraps under the focused link: it keeps clear of it (padding as wide as the link) instead */
@media (max-width:760px) { .skip:focus { right:12px } .skip:focus + #blocks-h { padding-right:9.5rem } }
.blocks { display:flex; gap:10px }
.divider { width:0; border-left:2px dashed var(--line); position:relative; margin:18px 16px 0 }
.divider::after { content:"chain tip"; position:absolute; top:-18px; left:-24px; font-size:10.5px; letter-spacing:.4px; color:var(--mut); white-space:nowrap }
.blk { width:132px; min-width:132px; min-height:132px; border-radius:10px; padding:10px 11px; display:flex; flex-direction:column; justify-content:space-between; text-align:left; font:inherit; border:0; cursor:pointer; position:relative; transition:transform .18s ease,box-shadow .18s ease; box-shadow:var(--blksh) }
.blk:hover { transform:translateY(-4px); box-shadow:var(--blksh-h) }
.blk span { display:block; overflow-wrap:anywhere } .blk .h { font-weight:700; font-size:13.5px } .blk .r { font-size:12px } .blk .s { font-size:11px } .blk .sub { display:inline; font-size:10.5px } .blk .badge { display:inline; font-size:10.5px; font-weight:600; padding:0 4px; border:1px solid currentColor; border-radius:4px; margin-left:3px }
.blk.mined { background:linear-gradient(160deg,#6a5ae0,#4435ad); color:#fff }
.blk.proj { background:linear-gradient(160deg,var(--c1),var(--c2)); color:#fff }
.blk.empty { background:var(--panel2); border:1px dashed var(--line); box-shadow:none; color:var(--mut) }
.blk.sel { box-shadow:inset 0 0 0 3px var(--text), var(--blksh) } .blk.sel::after { content:'selected'; position:absolute; bottom:-17px; left:0; right:0; text-align:center; font-size:11px; color:var(--mut) }
.grid { display:grid; grid-template-columns:1.1fr 1fr 1.3fr; gap:14px; margin-top:6px }
@media (max-width:1100px) { .grid { grid-template-columns:1fr 1fr } }
@media (max-width:760px) { .grid { grid-template-columns:1fr } }
.panel { background:var(--panel); border:1px solid var(--line); border-radius:12px; padding:16px 18px; box-shadow:var(--shadow) }
.kv { display:grid; grid-template-columns:auto 1fr; gap:5px 14px; font-size:13px }
.kv .l { color:var(--mut) } .kv .v { font-family:var(--mono); text-align:right; font-size:12.5px }
.mut { color:var(--mut) } .mono { font-family:var(--mono) }
.hist { display:flex; align-items:flex-end; gap:3px; height:90px; margin-top:14px }
.hist div { flex:1; background:var(--blue); border-radius:3px 3px 0 0; position:relative; min-height:2px }
.hist div:hover { opacity:.8 }
.hist div span { position:absolute; bottom:-16px; left:0; right:0; text-align:center; font-size:9.5px; color:var(--mut) }
.histlbl { display:flex; justify-content:space-between; font-size:11px; color:var(--mut); margin-top:20px }
canvas.g { width:100%; height:160px; display:block; margin-top:6px }
.tblwrap { max-height:480px; overflow:auto; margin:0 -18px -16px; padding:0 18px 16px; border-radius:0 0 12px 12px }
.txbtn { background:none; border:0; padding:0; font:inherit; color:var(--blue); cursor:pointer; text-decoration:underline; text-underline-offset:2px } .txbtn:hover { text-decoration-thickness:2px } .ext { display:inline-block; min-width:24px; min-height:24px; line-height:24px; text-align:center; text-decoration:none; margin-left:2px }
table { width:100%; border-collapse:collapse; font-size:12.5px }
th { text-align:left; color:var(--mut); font-weight:600; font-size:11.5px; letter-spacing:.4px; padding:6px 8px; border-bottom:1px solid var(--line) }
.tblwrap th { position:sticky; top:0; background:var(--panel); z-index:1 }
.tblwrap { scroll-padding-top:32px }
/* a detail's table scrolls in its own box (a block's rows are wider than a phone) */
.dtbl { overflow-x:auto; max-width:100% }
/* the fixed status bar (and the sticky header on wide screens) never hide what has the focus */
html { scroll-padding-bottom:48px }
@media (min-width:761px) { html { scroll-padding-top:64px } }
/* a stopped node: what is on screen stays, greyed, under a note with the time it stopped */
main.stopped .blocksrow, main.stopped section.panel, main.stopped .detail { filter:grayscale(1) }
td { padding:6px 8px; border-bottom:1px solid var(--rowline); white-space:nowrap }
td.amt, th.amt { text-align:right; font-family:var(--mono) }
tr:hover td { background:var(--panel2) }
tr.hi td { background:var(--hi) }
.detail { margin-top:14px } .detail:focus { outline:none } .detail:focus-visible { outline:2px solid var(--focus) }
.detail .kv { max-width:720px } .detail .kv .v { text-align:left; overflow-wrap:anywhere }
.dhead { display:flex; align-items:flex-start; justify-content:space-between; gap:12px } .dhead h2 { margin-top:6px } .detail table { margin-top:10px } .detail .note { margin-top:8px } .dfoot { margin-top:8px }
.refusals { font-family:var(--mono); font-size:11.5px; color:var(--mut); max-height:120px; overflow:auto; margin-top:8px; white-space:pre-wrap }
.idlecard { display:none } body.idle main > :not(.idlecard) { display:none } body.idle .idlecard { display:block }
.status { position:fixed; left:0; right:0; bottom:0; background:var(--panel); border-top:1px solid var(--line); padding:7px 18px; display:flex; align-items:center; gap:12px; font-size:12.5px; z-index:5 }
.status .msg { flex:1; white-space:nowrap; overflow:hidden; text-overflow:ellipsis }
.pb { width:200px; height:8px; background:var(--bg); border:1px solid var(--line); border-radius:99px; overflow:hidden }
.pb i { display:block; height:100%; background:linear-gradient(90deg,color-mix(in srgb,var(--acc) 75%,var(--red)),var(--acc)); width:0; transition:width .3s ease }
.pb[hidden] { display:none }
dialog { background:var(--panel); color:var(--text); border:1px solid var(--line); border-radius:14px; padding:0; max-width:560px; width:calc(100% - 40px); box-shadow:var(--shadow-lg) }
dialog::backdrop { background:rgba(8,8,16,.6) }
dialog .t { padding:12px 18px; border-bottom:1px solid var(--line); font-weight:650 }
dialog .b { padding:16px 18px; display:grid; gap:12px }
dialog .b label { display:grid; gap:5px; font-size:12.5px; color:var(--mut) }
dialog .b input[type=text] { padding:7px 9px; border:1px solid var(--fieldline); border-radius:8px; background:var(--bg); color:var(--text); font:inherit; font-family:var(--mono); font-size:12px; transition:border-color .15s,box-shadow .15s }
dialog .b input[type=text]:focus-visible { outline:2px solid var(--focus); outline-offset:1px }
dialog input[type=checkbox] { accent-color:var(--acc); width:15px; height:15px }
dialog .row, dialog .b label.row { display:flex; gap:8px; align-items:center; color:var(--text) }
dialog .f { padding:12px 18px; border-top:1px solid var(--line); display:flex; justify-content:flex-end; gap:8px }
.note { font-size:11.5px; color:var(--mut); line-height:1.5 }
@media (max-width:760px) {
main { padding:12px 12px 60px }
.top { flex-wrap:wrap; gap:10px; position:static }
.search { width:100%; flex-basis:100% } .search input { max-width:none; flex:1 } .top .fill { display:none }
.top .brand span { display:none }
/* the brand and the two buttons on the first row, the pill on its own (whatever its words), the search below */
.top .brand { margin-right:auto } .pill { order:1; flex:1 1 100%; min-width:0; overflow:hidden } .search { order:2 }
#pilltxt { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0 }
.pb { width:72px } #nodeinfo, .status .ver { display:none } .status .msg { min-width:0; flex:1 1 auto }
td.mono .txbtn { max-width:12ch; overflow:hidden; text-overflow:ellipsis; display:inline-block; vertical-align:bottom }
}
@media (min-width:761px) and (max-width:1100px) { .grid > .panel:nth-child(3) { grid-column:1 / -1 } }
/* between a phone and a wide screen (a laptop at 125-150% zoom): the header wraps instead of pushing the page sideways, the
search on its own row and the subtitle left out; it stays sticky, and bight.js keeps the top scroll padding at its height */
@media (min-width:761px) and (max-width:1100px) {
.top { flex-wrap:wrap; row-gap:8px } .top .brand span { display:none } .top .brand { white-space:nowrap }
.search { order:2; flex-basis:100% } .search input { max-width:none; flex:1 }
}
.sr { position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap }
#banners { display:flex; flex-direction:column; gap:0 }
.banner { display:flex; flex-wrap:wrap; gap:8px 12px; align-items:center; padding:8px 18px; border-bottom:1px solid var(--line); font-size:12.5px; background:var(--panel2) }
.banner span { flex:1 1 320px }
.banner.warn { border-left:4px solid var(--acc) } .banner.bad { border-left:4px solid var(--red) } .banner.info { border-left:4px solid var(--blue) }
.pill i.warn { background:var(--acc); box-shadow:0 0 7px var(--acc) } .pill i.idle { background:var(--mut) }
.blk.mined.unsigned { background:linear-gradient(160deg,#6b6f86,#4a4d60) }
.blk.more { width:auto; min-width:132px; cursor:default }
.badt { color:var(--red) }
body.embedded .top .brand span { display:none }
@media (prefers-reduced-motion:reduce) { *,*::before,*::after { animation:none !important; transition:none !important } .blk:hover { transform:none } }
@media (forced-colors:active) {
.blk { border:1px solid CanvasText } .blk.sel { border:3px solid Highlight; box-shadow:none }
.hist div, .pb i, .pill i { background:CanvasText; forced-color-adjust:none }
.search input:focus-visible, dialog input:focus-visible, :focus-visible { outline:2px solid Highlight }
}
</style>
</head>
<body>
<header class="top"><h1 class="brand"><svg aria-hidden="true" width="26" height="26" viewBox="0 0 32 32"><rect width="32" height="32" rx="7" fill="#1e2236"/><path d="M6 22c4-10 8-10 10 0s6 10 10 0" fill="none" stroke="#f0a04b" stroke-width="3" stroke-linecap="round"/></svg>Bight <span>txbt4 mempool · BLAKE2b testnet4 · a node in this tab</span></h1><div class="fill"></div>
<span class="pill" id="pill"><i id="pilldot" class="sync" aria-hidden="true"></i><span id="pilltxt">starting</span></span>
<button class="btn iconbtn" id="theme" type="button" aria-label="Switch theme"><svg aria-hidden="true" class="i-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/></svg><svg aria-hidden="true" class="i-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg></button><button class="btn iconbtn" id="settings" type="button" aria-label="Settings"><svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33h.01a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51h.01a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82v.01a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg></button><form class="search" id="search" role="search"><label class="sr" for="q">Search a transaction id, a block hash or a block height</label><input id="q" placeholder="txid, hash or height" spellcheck="false" autocomplete="off"><button type="submit">Search</button></form></header>
<section id="banners" aria-label="Notices"></section><div id="announce" class="sr" role="status" aria-live="polite"></div>
<main>
<div class="panel idlecard"><h2>This tab is idle</h2><p>Another tab of this browser runs the node (Reef, Bight, Winch or Hitch), and with it the mempool. Bight shows them where the node runs; this tab takes over as soon as that tab closes.</p><button class="btn" id="idle-check" type="button">Check again</button></div>
<a class="skip" href="#mp-h">Skip the blocks</a>
<h2 id="blocks-h">Blocks · the next ones as this tab would build them, then the last ones it validated</h2>
<div class="blocksrow" id="blocksrow" role="group" aria-labelledby="blocks-h"><div class="blocks proj" id="proj"><div class="blk empty"><span class="h">next block</span><span class="s">the mempool is followed once the tab is up to date</span></div></div><div class="divider" aria-hidden="true"></div><div class="blocks" id="mined"></div></div>
<div class="panel detail" id="detail" tabindex="-1" role="region" aria-labelledby="dtitle" hidden></div>
<div class="grid">
<section class="panel" aria-labelledby="mp-h"><h2 id="mp-h" tabindex="-1">Mempool</h2><div class="kv"><span class="l">Transactions</span><span class="v" id="m-count">…</span><span class="l">Size</span><span class="v" id="m-size">…</span><span class="l">Fees waiting</span><span class="v" id="m-fees">…</span><span class="l">Median rate (by size)</span><span class="v" id="m-med">…</span><span class="l">Next block</span><span class="v" id="m-next">…</span></div><div class="note" id="m-cover" style="margin-top:8px"></div><div class="hist" id="hist" role="img" aria-label="vB by fee rate"></div><div class="histlbl" aria-hidden="true"><span>sat/vB, log scale</span><span>vB by fee rate</span><span>≥ 1000</span></div><table class="sr"><caption>vB by fee rate band</caption><thead><tr><th scope="col">sat/vB</th><th scope="col">vB</th></tr></thead><tbody id="histtbl"></tbody></table></section>
<section class="panel" aria-labelledby="src-h"><h2 id="src-h">Where it comes from</h2><div class="kv"><span class="l">Relays</span><span class="v" id="s-relays">…</span><span class="l">Heard</span><span class="v" id="s-seen">0</span><span class="l">Accepted</span><span class="v" id="s-acc">0</span><span class="l">Refused</span><span class="v" id="s-ref">0</span><span class="l">Dropped (mined or evicted)</span><span class="v" id="s-drop">0</span><span class="l">From the mirror on start</span><span class="v" id="s-seed">…</span><span class="l">The node's mempool reported</span><span class="v" id="s-feed">…</span><span class="l">Last transaction from it</span><span class="v" id="s-feedtx">…</span></div><div class="note" id="chainnote" style="margin-top:8px"></div><div class="note" style="margin-top:10px">Kind 23404 events are a node publishing its mempool, one transaction each; kind 23503 events are sends from sidestr wallets. Each is checked here against this tab's own UTXO set before it counts. Refused lately:</div><div class="refusals" id="refusals" tabindex="0" role="region" aria-label="Recent refusals">none</div></section>
<section class="panel" aria-labelledby="g-h"><h2 id="g-h">Over time · <span id="gspan">this session</span></h2><canvas class="g" id="g" role="img" aria-label="Mempool over time"></canvas><div class="note" style="margin-top:4px"><span style="color:var(--blue)" aria-hidden="true">━</span> transactions <span style="color:var(--acc);margin-left:10px" aria-hidden="true">▆</span> vB (shaded) · each line scaled to its own top · <span id="gmax"></span></div></section>
</div>
<section class="panel" style="margin-top:14px" aria-labelledby="tx-h"><h2 id="tx-h">Transactions in this tab's mempool</h2><div class="tblwrap" tabindex="0" role="region" aria-labelledby="tx-h"><table><caption class="sr">The newest 300 transactions in this tab's mempool</caption><thead><tr><th scope="col">Transaction</th><th scope="col">Age</th><th scope="col" class="amt">vB</th><th scope="col" class="amt">Fee (sat)</th><th scope="col" class="amt">sat/vB</th><th scope="col">Block</th></tr></thead><tbody id="rows"><tr><td colspan="6" class="mut">nothing yet</td></tr></tbody></table></div></section>
</main>
<footer class="status"><span class="msg" id="syncmsg">Starting…</span><span id="synceta" class="mut"></span><div class="pb" id="pb" role="progressbar" aria-label="Sync progress" aria-valuemin="0" aria-valuemax="100" hidden><i id="pbi"></i></div><span class="mut" id="nodeinfo"></span><span class="mut ver">Bight <span id="ver"></span></span></footer>
<dialog id="dlg" aria-labelledby="dlg-t"><div class="t" id="dlg-t">Settings</div><div class="b">
<label>Snapshot URL<input type="text" id="o-snapshot" aria-describedby="o-snapnote"></label><span class="note" id="o-snapnote"></span><label>Blocks URL (the mirror's file, without .dat)<input type="text" id="o-blocks"></label>
<label class="row"><input type="checkbox" id="o-torrent"> fetch the snapshot from the swarm (WebTorrent), the mirror as webseed</label>
<label class="row"><input type="checkbox" id="o-seed"> seed the snapshot while this tab is open (uses your upload bandwidth)</label>
<div class="row"><button class="btn" id="o-wipe" type="button">Wipe the node's files…</button><span class="note" id="o-wipenote" role="status"></span></div><div class="row"><button class="btn" id="o-diag" type="button">Copy diagnostics</button></div><textarea id="o-diagtext" hidden readonly rows="8" aria-label="Diagnostics" style="width:100%;font-family:var(--mono);font-size:11px"></textarea><div class="note" id="o-err" role="alert" style="color:var(--red)"></div>
<div class="note">Bight, Reef, Winch and Hitch share this site's storage, so one copy of the node's files serves all four, and one tab runs the node. Source: <a href="https://github.com/bitcoin-blake/bight" target="_blank" rel="noopener">github.com/bitcoin-blake/bight</a>.</div>
</div><div class="f"><button class="btn" id="o-reset" type="button" style="margin-right:auto">Reset to defaults</button><button class="btn" id="o-cancel" type="button">Cancel</button><button class="btn" id="o-ok" type="button">OK</button></div></dialog>
<dialog id="welcome" aria-labelledby="wl-t" aria-describedby="wl-d"><div class="t" id="wl-t">Welcome to Bight</div><div class="b"><p id="wl-d" style="margin:0">To show the mempool, this tab runs a node: it downloads the chain's state at block <span id="wl-base">150,307</span> (<b id="wl-size">870 MB</b>), checks it, and validates every block since. That takes a few minutes on a fast connection and longer on a slow one; it is kept for next time (and shared with Reef, Winch and Hitch), and resumes if interrupted. Avoid starting on a metered connection.</p><p id="wl-space" class="note" style="margin:0"></p></div><div class="f"><button class="btn" id="wl-later" type="button">Not now</button><button class="btn" id="wl-start" type="button">Start</button></div></dialog>
<script type="module" src="bight.js?v=2026-10-01.15"></script>
</body>
</html>