<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>LONGWAVE — radios that catch the majors</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
<style>:root{
  --bg:#0b0e11;--panel:#13171d;--panel2:#0e1216;--line:#262d37;
  --ink:#eef1f6;--mut:#8b95a7;--dim:#5c6575;
  --acc:#9a7bff;--deep:#7132f5;--amber:#f0a94b;--red:#ff6f6f;
  --inkc:#9a7bff;--inkd:#7132f5;
  --cream:#f2eee4;--cream2:#e7e1d2;--cink:#16181c;--cmut:#4c5058;
  --sg:"Space Grotesk",ui-monospace,monospace;--in:Inter,-apple-system,"Segoe UI",system-ui,sans-serif;
  --shadow:6px 6px 0 rgba(0,0,0,.42);
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:104px}
body{background:var(--bg);color:var(--ink);font:400 16px/1.65 var(--in);padding-bottom:80px;
  -webkit-font-smoothing:antialiased}
header+.wrap{margin-top:88px}
::selection{background:var(--acc);color:#130726}
a{color:var(--acc);text-decoration:none}
a:hover{text-decoration:underline}
.wrap{max-width:1200px;margin:0 auto;padding:0 24px}
header{position:fixed;top:0;left:0;right:0;z-index:60;padding:14px 16px 0;pointer-events:none}
.navbar{pointer-events:auto;max-width:1200px;margin:0 auto;display:flex;align-items:center;gap:6px;
  background:rgba(19,23,29,.9);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  border:2px solid var(--line);padding:9px 12px 9px 16px}
.logo{font:700 17px var(--sg);letter-spacing:.04em;color:var(--ink);display:flex;align-items:center;gap:9px}
.logo:hover{text-decoration:none}
.logo b{color:var(--acc);font-weight:700}
.dot{width:9px;height:9px;background:var(--acc);border-radius:50%;box-shadow:0 0 10px var(--acc);
  animation:blink 2.4s infinite}
@keyframes blink{0%,100%{opacity:1}50%{opacity:.45}}
nav{display:flex;gap:2px;margin-left:14px;overflow-x:auto;scrollbar-width:none}
nav::-webkit-scrollbar{display:none}
nav button{background:none;border:0;color:var(--mut);font:500 13.5px var(--in);padding:8px 11px;
  cursor:pointer;white-space:nowrap}
nav button:hover{color:var(--ink)}
nav button.on{color:var(--ink);box-shadow:inset 0 -2px 0 var(--acc)}
.headR{margin-left:auto;display:flex;align-items:center;gap:8px}
.headR a{color:var(--mut);display:flex;padding:6px}
.headR a:hover{color:var(--acc)}
.headR a.inkBadge{display:inline-flex;align-items:center;gap:6px;font:700 10.5px var(--sg);
  letter-spacing:.14em;color:var(--inkc);border:1px solid var(--inkd);border-radius:99px;
  padding:4px 10px 3px;text-decoration:none;white-space:nowrap}
.headR a.inkBadge:hover{color:#fff;border-color:var(--inkc);box-shadow:0 0 12px rgba(113,50,245,.45)}
.inkBadge .drop{width:7px;height:7px;border-radius:50% 50% 50% 0;transform:rotate(-45deg);
  background:var(--inkd);box-shadow:0 0 8px var(--inkd)}
@media(max-width:760px){.inkBadge{display:none}}
.inkword{color:var(--inkc);font-weight:600}
#getWatt{background:none;border:2px solid var(--line);color:var(--ink);font:600 12.5px var(--sg);
  letter-spacing:.04em;padding:8px 13px;cursor:pointer;white-space:nowrap}
#getWatt:hover{border-color:var(--acc);color:var(--acc)}
#connBtn{background:var(--deep);border:2px solid var(--deep);color:#130726;font:700 12.5px var(--sg);
  letter-spacing:.04em;padding:8px 15px;cursor:pointer;white-space:nowrap}
#connBtn:hover{background:var(--acc);border-color:var(--acc)}
#connBtn.live{background:none;color:var(--acc);border-color:var(--acc)}
.tickwrap{position:fixed;left:0;right:0;bottom:0;z-index:55;background:#0d1013;
  border-top:2px solid var(--line);overflow:hidden;height:38px;display:flex;align-items:center}
.tick{display:inline-flex;white-space:nowrap;animation:mq 46s linear infinite}
.tick span{font:500 12px var(--sg);letter-spacing:.14em;text-transform:uppercase;color:var(--dim);
  padding:0 26px;display:inline-flex;gap:9px;align-items:center}
.tick b{color:var(--acc);font-weight:600}
@keyframes mq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
.kick{font:600 12.5px var(--sg);letter-spacing:.2em;text-transform:uppercase;color:var(--acc);
  display:flex;align-items:center;gap:10px;margin-bottom:18px}
.kick::before{content:"";width:8px;height:8px;background:var(--acc);border-radius:50%;
  box-shadow:0 0 9px var(--acc)}
h1{font:700 clamp(42px,5.8vw,74px)/0.98 var(--sg);text-transform:uppercase;letter-spacing:-.015em}
h1 .out{color:var(--acc)}
@supports((-webkit-text-stroke:2px #000) or (text-stroke:2px #000)){
  h1 .out{color:transparent;-webkit-text-stroke:2.5px var(--acc);text-stroke:2.5px var(--acc)}}
h2{font:700 clamp(28px,3.6vw,42px)/1.05 var(--sg);text-transform:uppercase;letter-spacing:-.01em;
  margin-bottom:14px}
.lede{font:400 17.5px/1.7 var(--in);color:#c6cdd9;max-width:56ch;margin-top:22px}
.lede b{color:var(--ink)}
.sub{color:var(--mut);font-size:15.5px;max-width:64ch}
.note{font-size:13.5px;color:var(--dim);line-height:1.6;margin-top:14px;max-width:58ch}
.mono{font:500 13px var(--sg);letter-spacing:.06em;color:var(--mut)}
section{padding:96px 0}
.btn{background:var(--deep);border:2px solid var(--deep);color:#130726;font:700 14.5px var(--sg);
  padding:15px 26px;cursor:pointer;box-shadow:var(--shadow);transition:transform .12s,box-shadow .12s}
.btn:hover{background:var(--acc);border-color:var(--acc);transform:translate(-2px,-2px);
  box-shadow:8px 8px 0 rgba(0,0,0,.42)}
.btn:disabled{opacity:.5;cursor:default;transform:none}
.btn.ghost{background:none;color:var(--ink);border:2px solid var(--line);box-shadow:none}
.btn.ghost:hover{border-color:var(--acc);color:var(--acc);transform:none}
.btnrow{display:flex;gap:12px;flex-wrap:wrap;margin-top:22px}
.cta{display:flex;gap:14px;flex-wrap:wrap;margin-top:30px}
.chips{display:flex;gap:10px;flex-wrap:wrap;margin-top:26px}
.chip{border:2px solid var(--line);background:var(--panel);padding:9px 14px;
  font:500 13px var(--sg);letter-spacing:.05em;color:var(--mut);display:flex;gap:9px;align-items:center}
.chip b{color:var(--ink);font-weight:600}
.chip b.g{color:var(--acc)}
.ca{margin-top:22px;font:500 12.5px var(--sg);letter-spacing:.04em;color:var(--dim);
  display:flex;gap:12px;flex-wrap:wrap;align-items:center}
.ca i{font-style:normal;color:var(--mut);word-break:break-all}
.ca .t{color:var(--acc)}
.hero-grid{display:grid;grid-template-columns:1.02fr .98fr;gap:56px;align-items:center}
.heroWrap{position:relative}
.heroWrap::before{content:"";position:absolute;inset:-12%;
  background:radial-gradient(circle at 50% 45%,rgba(113,50,245,.16),transparent 62%);pointer-events:none}
.hero{position:relative;border:2px solid var(--line);background:var(--panel2);aspect-ratio:1;
  display:flex;align-items:center;justify-content:center;flex-direction:column;gap:20px;
  box-shadow:10px 10px 0 rgba(0,0,0,.45);transition:transform .2s}
.hero img{width:100%;height:100%;display:block}
.dialface{width:130px;height:130px;border:2px solid var(--line);border-radius:50%;position:relative}
.dialface i{position:absolute;left:50%;top:50%;width:2px;height:52px;background:var(--acc);
  transform-origin:top center;box-shadow:0 0 8px var(--acc);animation:sweep 3.4s ease-in-out infinite}
@keyframes sweep{0%,100%{transform:rotate(-64deg)}50%{transform:rotate(64deg)}}
.heroFoot{display:flex;align-items:center;gap:12px;margin-top:14px}
.plaque{font:500 12.5px var(--sg);letter-spacing:.12em;text-transform:uppercase;color:var(--mut);flex:1}
.heroNav{display:flex;gap:8px}
.heroNav button{width:40px;height:40px;background:var(--panel);border:2px solid var(--line);
  color:var(--ink);font:600 15px var(--sg);cursor:pointer}
.heroNav button:hover{border-color:var(--acc);color:var(--acc)}
.pulse{animation:blink 1.8s infinite}
.bignum{border:2px solid var(--deep);background:linear-gradient(160deg,rgba(113,50,245,.07),rgba(113,50,245,.015));
  padding:44px 40px;margin-top:8px}
.bignum .lab{font:600 12.5px var(--sg);letter-spacing:.2em;text-transform:uppercase;color:var(--mut)}
.bignum b{display:block;font:700 clamp(52px,7vw,92px)/1.05 var(--sg);color:var(--acc);
  letter-spacing:-.02em;margin:10px 0 8px}
.bignum p{color:var(--mut);font-size:15.5px;max-width:70ch}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:16px}
.stat{border:2px solid var(--line);background:var(--panel);padding:24px 22px 20px}
.stat span{font:600 11.5px var(--sg);letter-spacing:.18em;text-transform:uppercase;color:var(--mut);display:block}
.stat b{display:block;font:700 clamp(30px,3vw,40px)/1.15 var(--sg);color:var(--acc);margin:10px 0 6px;
  letter-spacing:-.01em}
.stat b.w{color:var(--ink)}
.stat p{font-size:13.5px;color:var(--mut);line-height:1.55}
.band{background:var(--cream);color:var(--cink);border-top:6px solid var(--deep);
  border-bottom:6px solid var(--deep)}
.band h2{color:var(--cink)}
.band .kick{color:var(--deep)}
.band .kick::before{background:var(--deep);box-shadow:none}
.band .sub{color:var(--cmut)}
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:0;margin-top:44px;
  border:2px solid var(--cink)}
.step{padding:30px 26px 34px;border-right:2px solid var(--cink)}
.step:last-child{border-right:0}
.step:nth-child(even){background:var(--cream2)}
.step em{display:block;font:700 46px/1 var(--sg);font-style:normal;color:var(--deep);margin-bottom:16px}
.step b{display:block;font:600 16.5px var(--in);margin-bottom:9px}
.step p{font-size:14.5px;line-height:1.65;color:var(--cmut)}
.band .panel{background:#fbf9f2;border:2px solid var(--cink);color:var(--cink)}
.band .mono{color:var(--cmut)}
.band .btn.ghost{border-color:var(--cink);color:var(--cink)}
.band .btn.ghost:hover{border-color:var(--deep);color:var(--deep)}
.band input[type=range]{accent-color:var(--deep)}
.band label{color:var(--cink)}
.band label .sub{color:var(--deep)}
.band .lbl span{color:var(--cmut)}
.band .lbl b{color:var(--cink)}
.band .bar{background:#d8d2c0}
.band .bar i{background:var(--deep)}
.band .bar.u i{background:#c2882f}
.band .msg.err{color:#b23b3b;border-color:#b23b3b}
.band .msg.ok{color:var(--deep);border-color:var(--deep)}
.panel{border:2px solid var(--line);background:var(--panel);padding:26px}
.lbl{display:flex;justify-content:space-between;gap:12px;font:500 12px var(--sg);
  letter-spacing:.12em;text-transform:uppercase;color:var(--mut);margin-bottom:7px}
.lbl b{color:var(--ink);letter-spacing:.04em}
.bar{height:8px;background:var(--line);margin-bottom:13px;overflow:hidden}
.bar i{display:block;height:100%;background:var(--acc);width:0;transition:width .5s}
.bar.u i{background:var(--amber)}
.msg{display:none;margin-top:16px;border:2px solid var(--line);padding:12px 16px;
  font:500 13px var(--sg);letter-spacing:.03em;color:var(--mut);max-width:70ch}
.msg:not(:empty){display:block}
.msg.ok{color:var(--acc);border-color:var(--deep)}
.msg.err{color:var(--red);border-color:var(--red)}
#toast{display:none;position:fixed;right:22px;bottom:56px;z-index:70;background:var(--panel);
  border:2px solid var(--acc);color:var(--ink);padding:13px 18px;font:500 13px var(--sg);
  max-width:340px;box-shadow:var(--shadow)}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(272px,1fr));gap:18px;margin-top:28px}
.card{border:2px solid var(--line);background:var(--panel);display:flex;flex-direction:column}
.card img{width:100%;display:block;border-bottom:2px solid var(--line)}
.nocarrier{aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:9px;background:var(--panel2);border-bottom:2px solid var(--line);text-align:center;padding:18px}
.nocarrier b{font:700 19px var(--sg)}
.nocarrier span{font:500 11.5px var(--sg);letter-spacing:.12em;color:var(--dim);text-transform:uppercase}
.nocarrier a{font:500 11.5px var(--sg);letter-spacing:.08em}
.artwait{color:var(--acc);animation:blink 1.8s infinite}
.cid{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:15px 17px 4px;flex-wrap:wrap}
.cid b{font:700 16px var(--sg);letter-spacing:.02em}
.tag{font:600 10.5px var(--sg);letter-spacing:.1em;text-transform:uppercase;border:2px solid var(--line);
  color:var(--mut);padding:3px 8px}
.tag.live{border-color:var(--deep);color:var(--acc)}
.tag.hot{border-color:var(--amber);color:var(--amber)}
.st{padding:6px 17px 0;font-size:13px;color:var(--mut);line-height:1.55}
.card .lbl{padding:0 17px;margin-top:10px}
.card .bar{margin:0 17px 4px}
.ops{display:flex;flex-wrap:wrap;gap:8px;padding:14px 17px 4px;margin-top:auto}
.ops button{background:none;border:2px solid var(--line);color:var(--ink);font:600 11.5px var(--sg);
  letter-spacing:.06em;text-transform:uppercase;padding:8px 12px;cursor:pointer}
.ops button:hover{border-color:var(--acc);color:var(--acc)}
.card .msg{margin:10px 17px 15px}
.card .msg:empty{margin:0 0 15px}
.fortnight{position:relative;height:52px;border:2px solid var(--line);background:var(--panel2);
  margin-top:30px;overflow:hidden}
.fnRed{position:absolute;left:0;top:0;bottom:0;width:50%;
  background:repeating-linear-gradient(-45deg,rgba(240,169,75,.14) 0 10px,transparent 10px 20px);
  border-right:2px dashed rgba(240,169,75,.5)}
.fnSeal{position:absolute;right:0;top:0;bottom:0;width:3.6%;background:rgba(113,50,245,.3);
  border-left:2px solid var(--acc)}
.fnNow{display:none}
.fnLab{position:absolute;top:50%;transform:translateY(-50%);font:600 10.5px var(--sg);
  letter-spacing:.14em;text-transform:uppercase;color:var(--mut)}
table{width:100%;border-collapse:collapse;margin-top:26px;border:2px solid var(--line)}
th{font:600 11.5px var(--sg);letter-spacing:.16em;text-transform:uppercase;color:var(--mut);
  text-align:left;padding:13px 16px;border-bottom:2px solid var(--line);background:var(--panel)}
td{padding:13px 16px;border-bottom:1px solid var(--line);font:500 14px var(--sg)}
tr:last-child td{border-bottom:0}
th.num,td.num{text-align:right}
.sig{color:var(--acc)}
.noi{color:var(--mut)}
td button{background:none;border:2px solid var(--line);color:var(--ink);font:600 11px var(--sg);
  letter-spacing:.06em;text-transform:uppercase;padding:6px 11px;cursor:pointer}
td button:hover{border-color:var(--acc);color:var(--acc)}
.dial-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:36px}
#knobs label{display:flex;justify-content:space-between;font:600 12px var(--sg);
  letter-spacing:.14em;text-transform:uppercase;margin:13px 0 5px}
#knobs input[type=range]{width:100%;accent-color:var(--deep)}
#wbHex{color:var(--deep);font-weight:700}
.tok-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:24px;margin-top:36px}
input[type=number],input[type=text]{background:var(--panel2);border:2px solid var(--line);
  color:var(--ink);font:600 16px var(--sg);padding:12px 14px;outline:none;min-width:0}
input:focus{border-color:var(--acc)}
.tstats{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.proof{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:44px}
.pf{border:2px solid var(--line);background:var(--panel);padding:22px;display:flex;flex-direction:column}
.pf em{display:block;font:700 24px/1 var(--sg);font-style:normal;color:var(--deep);margin-bottom:13px}
.pf b{font:600 14.5px var(--in);display:block;margin-bottom:8px}
.pf p{font-size:13.5px;color:var(--mut);line-height:1.6;margin-bottom:12px}
.pf a{margin-top:auto;font:600 12px var(--sg);letter-spacing:.08em;text-transform:uppercase}
.waves-grid{display:grid;grid-template-columns:.9fr 1.1fr;gap:24px;margin-top:36px}
.term{border:2px solid var(--line);background:var(--panel2);display:flex;flex-direction:column}
.termbar{display:flex;align-items:center;gap:10px;background:var(--panel);
  border-bottom:2px solid var(--line);padding:10px 16px;font:600 12px var(--sg);
  letter-spacing:.16em;text-transform:uppercase;color:var(--mut)}
.termbar b{color:var(--acc)}
.feed{max-height:420px;overflow-y:auto;padding:14px 18px;font:500 13px var(--sg)}
.tr{padding:9px 0;border-bottom:1px solid var(--line);display:flex;gap:10px;flex-wrap:wrap;
  align-items:baseline}
.tr:last-child{border-bottom:0}
.blk{color:var(--deep);font-weight:600;white-space:nowrap}
.who{color:var(--dim);white-space:nowrap}
.say{color:var(--ink);flex:1;min-width:180px;word-break:break-word;font-family:var(--in);font-size:14px}
details{border:2px solid var(--line);background:var(--panel);margin-bottom:12px}
summary{cursor:pointer;list-style:none;padding:18px 22px;font:600 14px var(--sg);
  letter-spacing:.1em;text-transform:uppercase;display:flex;align-items:center;gap:14px}
summary::-webkit-details-marker{display:none}
summary::before{content:"+";color:var(--acc);font:700 18px var(--sg);width:16px}
details[open] summary::before{content:"−"}
details[open] summary{border-bottom:2px solid var(--line)}
.din{padding:20px 24px 24px;color:#c6cdd9;font-size:15px;line-height:1.75}
.din p+p{margin-top:12px}
.din b{color:var(--ink)}
.gld{color:var(--acc);font-weight:600}
.addr{font:500 12.5px var(--sg);line-height:2;word-break:break-all;color:var(--mut)}
footer{border-top:2px solid var(--line);padding:30px 0 34px;margin-top:40px}
footer .wrap{display:flex;gap:18px;flex-wrap:wrap;align-items:center;
  font:500 12.5px var(--sg);letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
footer a{color:var(--mut)}
footer a:hover{color:var(--acc)}
.rev{opacity:0;transform:translateY(18px);transition:opacity .6s,transform .6s}
.rev.in{opacity:1;transform:none}
@media(max-width:1020px){
  .hero-grid,.dial-grid,.tok-grid,.waves-grid{grid-template-columns:1fr}
  .stats,.proof{grid-template-columns:1fr 1fr}
  .steps{grid-template-columns:1fr 1fr}
  .step:nth-child(2){border-right:0}
  .step:nth-child(-n+2){border-bottom:2px solid var(--cink)}
  section{padding:72px 0}
}
@media(max-width:600px){
  .stats,.proof,.steps{grid-template-columns:1fr}
  .step{border-right:0;border-bottom:2px solid var(--cink)}
  .step:last-child{border-bottom:0}
  .headR #getWatt{display:none}
  h1{font-size:40px}
}</style>
</head>
<body>
<header>
  <div class="navbar">
    <a class="logo" href="#onair"><span class="dot"></span>LONG<b>WAVE</b></a>
    <nav>
      <button data-p="onair" class="on">Home</button>
      <button data-p="receivers">My receivers</button>
      <button data-p="charts">League</button>
      <button data-p="workbench">Dial</button>
      <button data-p="token">$WATT</button>
      <button data-p="manual">Docs</button>
    </nav>
    <span class="headR">
      <a class="inkBadge" href="https://explorer.inkonchain.com" target="_blank" rel="noopener noreferrer" title="Ink · chain 57073"><span class="drop"></span>ON INK</a>
      <a id="osLink" target="_blank" rel="noopener noreferrer" href="#" title="OpenSea"><svg width="17" height="17" viewBox="0 0 90 90" fill="currentColor"><path d="M45 0C20.2 0 0 20.2 0 45s20.2 45 45 45 45-20.1 45-45S69.9 0 45 0zM22.2 46.5l.2-.3 11.7-18.3c.2-.3.6-.2.7.1 2 4.4 3.6 9.8 2.8 13.2-.3 1.4-1.2 3.3-2.2 5l-.4.7c-.1.1-.2.2-.4.2H22.6c-.4 0-.6-.4-.4-.6zm52.2 6.3c0 .2-.1.3-.3.4-1.1.5-4.8 2.2-6.3 4.4-3.9 5.4-6.9 13.2-13.5 13.2H26.8c-9.8 0-17.7-8-17.7-17.8v-.3c0-.3.2-.5.5-.5h15.3c.3 0 .5.3.5.6-.1 1 .1 2.1.6 3.1.9 1.9 2.8 3.1 4.9 3.1h7.6v-5.9h-7.5c-.4 0-.6-.4-.4-.7l.3-.4c.7-1 1.7-2.6 2.7-4.4.7-1.2 1.3-2.5 1.9-3.8l.3-.7c.1-.4.3-.8.4-1.1.1-.3.2-.7.2-1 .3-1.7-.2-3.4-.5-5.1-.2-.9-.4-1.8-.7-2.7-.3-1-.6-2-.9-2.9-.2-.6-.4-1.2-.6-1.8l-1.1-3c-.1-.3.2-.6.5-.5l6.9 1.9h.2l.9.3 1 .3.4.1v-4.1c0-2 1.6-3.6 3.6-3.6 1 0 1.9.4 2.5 1.1.6.7 1.1 1.6 1.1 2.5v6.1l.7.2c.1 0 .1.1.2.1.2.1.4.3.7.5.2.2.5.4.8.7.6.5 1.4 1.2 2.2 2 .2.2.4.4.6.6.9 1 2 2.2 3 3.6.3.4.6.8.8 1.2.3.4.6.9.8 1.3.3.5.6 1.1.8 1.7.1.2.2.5.3.7.3.7.5 1.4.6 2.1.1.2.1.5.1.7.1.8.1 1.6 0 2.4-.1.4-.2.7-.3 1.1-.1.3-.3.7-.4 1-.3.7-.7 1.4-1.1 2l-.5.7c-.2.2-.4.5-.6.7-.2.3-.5.5-.7.8-.2.2-.4.5-.7.7-.3.4-.7.7-1 1-.2.2-.4.4-.7.6-.2.2-.4.4-.7.5-.3.3-.6.5-.9.7l-.6.4c-.1.1-.2.1-.3.1h-4.8v5.9h6c1.3 0 2.6-.5 3.6-1.4.4-.3 1.9-1.6 3.6-3.5.1-.1.1-.1.2-.1l16-4.6c.3-.1.6.1.6.4v3.4z"/></svg></a>
      <button id="getWatt">Get $WATT</button>
      <button id="connBtn">CONNECT</button>
    </span>
  </div>
</header>
<main>

<section id="onair" style="padding-top:150px"><div class="wrap">
  <div class="hero-grid">
    <div>
      <p class="kick">4,444 receivers on <span class="inkword">Ink</span> &middot; fully on-chain</p>
      <h1>Radios that catch<br><span class="out">the majors.</span></h1>
      <p class="lede">Vacuum-tube receivers with the strategy soldered in. Each one holds
      <b>real tokens — BTC, ETH and hard dollars</b> in its own on-chain vault, grows its catch with every relay tick,
      and competes in a fortnight league rated by <b>real profit</b>. No owner. No servers. No off switch.</p>
      <div class="cta">
        <button class="btn" id="mintBtn">Buy a receiver &middot; 0.0005 ETH</button>
        <button class="btn ghost" id="crystalBtn">Free crystal set</button>
      </div>
      <div class="chips">
        <span class="chip">border closes in <b class="g" id="sBorder">--</b></span>
        <span class="chip">assembled <b id="sMint">-- / 4444</b></span>
        <span class="chip">cap <b>2 / wallet</b></span>
      </div>
      <p class="ca">$WATT <i id="wattCA">--</i> <a id="fCopy" href="#">copy</a> <a id="fDex" class="t" target="_blank" rel="noopener noreferrer" href="#">chart</a></p>
      <p class="note">One click — the tubes warm themselves in ~2 minutes. The crystal is the free
      1h demo: soulbound, sees everything, earns nothing.</p>
      <div class="msg" id="mintMsg"></div>
      <div id="warmTrack" style="display:none;margin-top:18px">
        <div class="lbl"><span>Warming up</span><b id="warmLbl">tubes cold</b></div>
        <div class="bar"><i id="warmBar"></i></div>
      </div>
    </div>
    <div>
      <div class="heroWrap" id="heroWrap">
        <div class="hero" id="hero"><div class="dialface"><i></i></div><span class="mono pulse">TUNING THE CARRIER&hellip;</span></div>
      </div>
      <div class="heroFoot">
        <p class="plaque" id="heroCap">Live from the chain</p>
        <div class="heroNav"><button id="heroPrev">&#8592;</button><button id="heroNext">&#8594;</button></div>
      </div>
    </div>
  </div>

  <div class="bignum rev" style="margin-top:84px">
    <span class="lab">$WATT burned forever, out of 1,000,000,000</span>
    <b id="tBurned">--</b>
    <p>Gone for good — burned by every GAIN step and every REDLINE armed. The deck buys $WATT
    on every assembly and pays every league prize in it. Supply only falls.</p>
  </div>

  <div class="stats rev">
    <div class="stat"><span>Still on air</span><b id="sLive">--</b><p>Receivers still catching. Sign-off retires them forever, so this number only falls.</p></div>
    <div class="stat"><span>Relay pot</span><b id="tPot">--</b><p>ETH waiting in the hourly relay — it becomes stock for every dial on the next tick.</p></div>
    <div class="stat"><span>Yours</span><b class="w"><i id="sMine" style="font-style:normal">&mdash;</i> &middot; <i id="sWatt" style="font-style:normal">&mdash;</i></b><p>Your receivers and your $WATT, straight off the chain.</p></div>
    <div class="stat"><span>Mint price</span><b class="w">0.0005 <span style="font-size:.55em">ETH</span></b><p>25% loads your receiver&#39;s own vault. 15% buys $WATT into the prize cellars.</p></div>
  </div>
</div></section>

<div class="band"><section style="padding:88px 0"><div class="wrap">
  <p class="kick">How it works</p>
  <h2>The stock lives inside the radio.</h2>
  <p class="sub">Every other NFT pays you from a pool. A LONGWAVE receiver fills up instead —
  and what is inside goes with it when it sells.</p>
  <div class="steps rev">
    <div class="step"><em>01</em><b>Assemble</b><p>One click, 0.0005 ETH. Your tuning is drawn from an era that doesn&#39;t exist yet — nothing to snipe.</p></div>
    <div class="step"><em>02</em><b>It warms itself</b><p>The keeper broom passes every ~2 minutes. Your receiver comes online already charged.</p></div>
    <div class="step"><em>03</em><b>It catches the majors</b><p>Every relay tick catches the majors themselves — BTC, ETH and hard dollars (USD₮0) — real tokens in its own ERC-6551 vault.</p></div>
    <div class="step"><em>04</em><b>The league pays</b><p>Fortnight charts rate receivers by real profit. Winners claim $WATT. GAIN and REDLINE raise the stakes.</p></div>
  </div>
</div></section></div>

<section id="receivers"><div class="wrap">
  <p class="kick">/ 01 &mdash; my receivers</p>
  <h2>Your bench</h2>
  <p class="sub" id="rxHint">Connect your wallet to see your receivers.</p>
  <div class="btnrow">
    <button class="btn ghost" id="rxConnect">Connect wallet</button>
    <button class="btn ghost" id="rxReload" style="display:none">Reload</button>
    <button class="btn ghost" id="rxSweep" style="display:none">Warm all &middot; earn 50 $WATT/unit</button>
    <button class="btn ghost" id="rxSettle" style="display:none">Settle all</button>
  </div>
  <div class="msg" id="rxMsg"></div>
  <div class="cards" id="rxCards"></div>
</div></section>

<section id="charts"><div class="wrap">
  <p class="kick">/ 02 &mdash; the league</p>
  <h2>Fortnight charts. Real profit.</h2>
  <p class="sub">Every 14 days a chart closes. The first half is the redline window, the border
  seals it, and receivers are rated by what their vaults actually earned.</p>
  <div class="fortnight" id="fortnight">
    <div class="fnRed"></div><div class="fnSeal"></div><div class="fnNow" id="fnNow"></div>
    <span class="fnLab" style="left:14px">chart opens</span>
    <span class="fnLab" style="left:26%">redline window</span>
    <span class="fnLab" style="right:5.4%">border &middot; 12h seal &#8594;</span>
  </div>
  <div class="chips" style="margin-top:20px">
    <span class="chip">current chart <b class="g" id="cNow">--</b></span>
    <span class="chip">border closes in <b id="cCount">--</b></span>
    <span class="chip">last chart total edge <b id="cEdge">--</b></span>
  </div>
  <div class="panel" style="margin-top:20px;display:flex;gap:18px;align-items:center;flex-wrap:wrap">
    <b id="cSeal" style="flex:1;min-width:220px;font:500 14px var(--sg);letter-spacing:.03em">--</b>
    <button class="btn ghost" id="sealBtn">Seal the border &middot; bounty 1,000 $WATT</button>
  </div>
  <div class="msg" id="cMsg"></div>
  <table id="cTable" style="display:none">
    <thead><tr><th>Receiver</th><th class="num">Chart PnL</th><th>Standing</th><th></th></tr></thead>
    <tbody id="cRows"></tbody>
  </table>
</div></section>

<div class="band"><section id="workbench" style="padding:88px 0"><div class="wrap">
  <p class="kick">/ 03 &mdash; the dial</p>
  <h2>Read a tuning before it exists.</h2>
  <p class="sub">A RISK dial: how far the needle leans toward signal — BTC and ETH — versus
  ground, hard dollars in USD₮0. The page computes the exact integers the deck does — spin the dial,
  then let the chain countersign.</p>
  <div class="dial-grid">
    <div class="panel">
      <div id="knobs"></div>
      <div class="btnrow">
        <button class="btn ghost" id="wbRandom">Spin the dial</button>
        <button class="btn ghost" id="wbVerify">Verify on-chain</button>
      </div>
      <div class="msg" id="wbMsg"></div>
    </div>
    <div class="panel">
      <p class="mono" style="margin-bottom:18px">TUNING <span id="wbHex">0x--</span></p>
      <div id="wbBars"></div>
      <div class="lbl" style="margin-top:18px"><span>Phase</span><b id="wbPhase">--</b></div>
      <div class="lbl" style="margin-top:8px"><span>Redline factor (&#215;wattage)</span><b id="wbRed">--</b></div>
    </div>
  </div>
</div></section></div>

<section id="token"><div class="wrap">
  <p class="kick">/ 04 &mdash; the power line</p>
  <h2>$WATT runs the bench.</h2>
  <p class="sub">Fixed 1B supply, paired against USD₮0. GAIN and REDLINE burn it.
  The deck itself buys it on every mint.</p>
  <div class="tok-grid">
    <div class="panel">
      <div class="lbl" style="margin-bottom:14px"><span>Get $WATT &middot; the deck&#39;s own well</span><b id="tQuote">--</b></div>
      <div style="display:flex;gap:10px;align-items:center">
        <input id="tEth" type="number" min="0" step="0.001" value="0.01" style="flex:1">
        <span class="mono">ETH</span>
        <button class="btn" id="tBuy" style="padding:12px 26px">Buy</button>
      </div>
      <p class="note">Same adapter the deck drinks from on every assembly. Floor set 1% under
      the live quote — a worse fill reverts.</p>
      <div class="msg" id="tMsg"></div>
    </div>
    <div class="tstats">
      <div class="stat"><span>Supply</span><b class="w">1B</b><p>Fixed forever. No mint key exists.</p></div>
      <div class="stat"><span>1 ETH buys</span><b id="tRate">--</b><p>Live quote from the deck&#39;s well.</p></div>
      <div class="stat"><span>Pair</span><b class="w">USD₮0</b><p>One-sided Slipstream (the chain&#39;s V3) pool, position burned.</p></div>
      <div class="stat"><span>Team allocation</span><b class="w">0%</b><p>The team buys like everyone else.</p></div>
    </div>
  </div>
  <span id="tMine" style="display:none"></span>
  <div class="proof rev">
    <div class="pf"><em>I</em><b>Fully on-chain art</b><p>Every plate is drawn by the chain itself — no server, no IPFS, nothing to take down.</p><a id="pfR" target="_blank" rel="noopener noreferrer" href="#">renderer &#8599;</a></div>
    <div class="pf"><em>II</em><b>No owner &middot; no upgrades</b><p>No admin keys, no proxy, no pause. Nobody can change the deck — including us.</p><a id="pfD" target="_blank" rel="noopener noreferrer" href="#">verified source &#8599;</a></div>
    <div class="pf"><em>III</em><b>Position burned</b><p>The one-sided $WATT liquidity position on Slipstream (the chain&#39;s V3) is burned to the dead address. No key can ever pull it.</p><a id="pfP" target="_blank" rel="noopener noreferrer" href="#">0xdEaD &#8599;</a></div>
    <div class="pf"><em>IV</em><b>Fair launch &middot; 0% team</b><p>All 1B $WATT goes one-sided into the pool. Buyers bring the other side. Zero owner capital.</p><a id="pfW" target="_blank" rel="noopener noreferrer" href="#">token &#8599;</a></div>
  </div>
</div></section>

<section id="airwaves-sec"><div class="wrap">
  <p class="kick">/ 05 &mdash; community</p>
  <h2>The Airwaves.</h2>
  <div class="waves-grid">
    <div>
      <p class="sub" style="line-height:1.8">An on-chain message board for holders. Transmissions
      are events on the chain — free to read, impossible to delete, yours forever.
      Any holder can key the mic.</p>
      <div style="display:flex;gap:10px;margin-top:24px;flex-wrap:wrap">
        <input type="text" id="wavesIn" maxlength="280" placeholder="Key the mic — 280 bytes, forever" style="flex:1;min-width:200px;font-weight:500;font-size:14px">
        <button class="btn ghost" id="wavesTx">Transmit</button>
      </div>
      <div class="msg" id="wavesMsg"></div>
    </div>
    <div class="term">
      <div class="termbar">&gt;_ <b>91.5 MHz</b> open frequency &middot; holders only</div>
      <div id="wavesFeed" class="feed">tuning the frequency&hellip;</div>
    </div>
  </div>
</div></section>

<section id="manual"><div class="wrap">
  <p class="kick">/ 06 &mdash; docs</p>
  <h2>The manual.</h2>
  <p class="sub" style="margin-bottom:30px">Every promise the deck keeps, in writing.</p>
  <details open><summary>What this is</summary><div class="din">
    <p>LONGWAVE is a shelf of 4,444 vacuum-tube receivers living entirely on
    Ink. The art is drawn by the contracts, glyph by glyph. The strategy
    &mdash; the <b>TUNING</b> &mdash; is eight bytes soldered in at warm-up and visible in the
    plate itself: the needles, the fan, the coil, the shadow gate are readings, not decoration.</p>
  </div></details>
  <details><summary>The vault is real</summary><div class="din">
    <p>Every receiver owns an ERC-6551 account &mdash; a real address you can open in the
    explorer. The stations it catches are the majors themselves &mdash; BTC, ETH and hard
    dollars (USD₮0), real tokens sitting on that
    address. Not a points ledger, not a promise: balances. They travel with the NFT
    on every sale, and <b>SIGN-OFF</b> hands everything to the holder and retires the
    receiver forever. Supply only falls; the survivors catch denser.</p>
    <p class="note">One caution before you sign off: empty the 6551 account of
    <b>everything</b> first &mdash; not only stations, but any airdrop or stray token
    sent to it. A burned receiver&#39;s account can no longer be commanded, and whatever
    is left inside is stranded for good. The bench&#39;s SIGN OFF button withdraws your
    pending catch to you, but only you can clear the account itself. If a station has
    been frozen by its issuer and cannot be moved, use <b>WAIVE-EXIT</b>: it lets you
    leave and consciously forfeit what is frozen, instead of being locked in forever.</p>
  </div></details>
  <details><summary>The flywheel</summary><div class="din">
    <p>25% of every assembly loads the receiver&#39;s own vault at warm-up &mdash; it ships
    already catching. 15% buys <span class="gld">$WATT</span> into the prize cellars. Royalties
    and every sink feed the <b>RELAY</b>: a permissionless hourly tick that converts the
    deck&#39;s ETH into stations for every dial, weighted by tuning &#215; GAIN, guarded by a
    1-hour TWAP floor. Keepers earn WATT for every pass; if every keeper dies, any
    holder can crank the handle by hand.</p>
  </div></details>
  <details><summary>Fair by construction</summary><div class="din">
    <p>Blind assembly: your tuning is drawn from an entropy seal of a <i>future</i> era
    (~2 minutes), stirred by every paid touch in between &mdash; there is nothing to snipe
    and nobody who could. No owner keys, no upgrades, no allowlists, no server.
    $WATT: one billion, 100% one-sided into a Slipstream (the chain&#39;s V3) pool, and the liquidity position
    itself &mdash; the position NFT &mdash; is burned to the dead address: no key can ever
    pull it, and the proof is one explorer look at 0xdEaD. The launch instant refuses
    buys outright and for a full minute after it every fill and every wallet is capped
    at 2%. The team buys like everyone else.</p>
  </div></details>
  <details><summary>The league</summary><div class="din">
    <p>Charts are 14 days. Ratings are real profit measured against the usd anchor
    from the pools&#39; own tick history. Registration in the first week after a border,
    claims in the second; each chart&#39;s prize budget is a fixed quarter of the cellar,
    fixed at the border, and whatever a chart leaves unclaimed rolls forward. <b>GAIN</b>
    (+3dB a step, burn WATT) is soldered to the receiver forever and survives every sale.
    <b>REDLINE</b> pushes one chart into the red zone: gains and losses both multiplied
    through WATTAGE. It can be armed only in the chart&#39;s first half &mdash; you take the
    leverage blind to most of the fortnight it magnifies, so there is nothing to time.</p>
  </div></details>
  <details><summary>Crystal set</summary><div class="din">
    <p>The free funnel, historically honest: a detector receiver works without power,
    but weakly. Soulbound, sees the charts and its would-be rank, catches nothing,
    expires in 1 hour, then anyone may purge it. One per wallet, forever.</p>
  </div></details>
  <details><summary>Wiring</summary><div class="din">
    <p class="addr" id="manAddrs">THE RECEIVER DECK -- &middot; THE POWER LINE -- &middot; renderer --</p>
  </div></details>
</div></section>

<footer><div class="wrap">
  <span style="color:var(--ink);font-weight:700">LONG<span style="color:var(--acc)">WAVE</span></span>
  <span>ownerless &middot; on-chain &middot; forever</span>
  <span style="margin-left:auto;display:flex;gap:18px">
    <a id="fExp" target="_blank" rel="noopener noreferrer" href="#">Explorer</a>
    <a id="fOs" target="_blank" rel="noopener noreferrer" href="#">OpenSea</a>
  </span>
</div></footer>
<div id="toast"></div>
<div class="tickwrap"><div class="tick" id="tick"><span>loading&hellip;</span></div></div>
</main>
<script>"use strict";const t={chainId:"0xdef1",chainName:"Ink",rpc:["https://rpc-qnd.inkonchain.com","https://rpc-ten.inkonchain.com","https://ink.drpc.org","https://rpc-gel.inkonchain.com"],explorer:"https://explorer.inkonchain.com",deck:"0x535f101A24AE54C60eFDd4820255168744C75A97",watt:"0x5b6A57566137097fa07a57C2a4a4De8E38973a98",pool:"0x2CD98E22E7AC80450Ff3b778ea2D6549951f2111",plates:"0x8dbe1e2E1e9BB27fCc93ef89635F87417fB40B2F",waves:"0x839f017fac588ca512166fafDB51CbB5d6e96cD4",os:"longwave",birthBlock:54067856,price:500000000000000n},e="b23add57",n="c87b56dd",a="4f02c420",o="79d6f405",r="8fe28574",s="8f4e4321",c="7bb55613",i="70a08231",l="c5980bf4",d="8ada6b0f",h="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",u=1209600n,m=4444n,w=t=>t.replace(/^0x/,"").padStart(64,"0"),f=t=>w(BigInt(t).toString(16)),p=t=>t.replace(/^0x/,"").padEnd(64,"0"),g=(t,...e)=>"0x"+t+e.join(""),y=t=>BigInt("0x"===t?0:t);let x=0;const b=t=>new Promise(e=>setTimeout(e,t));async function E(e,n,a=3,o=!1){const r=o?t.rpc.slice(0,2):t.rpc;let s;for(let c=0;c<a;c++){for(let a=0;a<r.length;a++){const c=r[(x+a)%r.length];try{const r=await fetch(c,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:e,params:n})});if(429===r.status||r.status>=500)throw new Error("node busy "+r.status);const s=await r.json();if(s.error)throw new Error(s.error.message+(s.error.data?" "+(s.error.data.data||s.error.data):""));return o||(x=(x+a)%t.rpc.length),s.result}catch(t){s=t}}await b(400*(c+1))}throw s}const C=(t,e,n)=>E("eth_call",[{to:t,data:e},"latest"],3,n);function k(t){const e=t.replace(/^0x/,""),n=2*Number(BigInt("0x"+e.slice(0,64))),a=2*Number(BigInt("0x"+e.slice(n,n+64))),o=e.slice(n+64,n+64+a),r=new Uint8Array(o.length/2);for(let t=0;t<r.length;t++)r[t]=parseInt(o.substr(2*t,2),16);return(new TextDecoder).decode(r)}const N=()=>!t.deck.includes("DECK"),v=t=>document.getElementById(t);function S(t,e=4200){const n=v("toast");n.textContent=t,n.style.display="block",clearTimeout(n._t),n._t=setTimeout(()=>n.style.display="none",e)}const I={WrongPrice:"wrong price - assembly is exactly 0.0005 ETH",SoldOut:"SOLD OUT - the shelf is empty",WalletCap:"wallet cap reached (2 receivers)",NotEOA:"contracts cannot assemble - use a plain wallet",TooEarly:"the era has not turned yet - the tubes warm ~2 minutes after assembly",AlreadyWarm:"already warm",StillCold:"tubes still cold - warm the receiver first",NotYours:"not your receiver",CrystalHeld:"one crystal per wallet, forever",CrystalSoulbound:"crystals cannot do that",AccountNotEmpty:"empty the 6551 vault first (VAULT button, withdraw every token)",GainMaxed:"gain is maxed (+12dB)",RedlinedAlready:"already in the red this chart",RedlineWindowClosed:"the red window is the FIRST HALF of a chart - re-arm when the next chart opens",RegisterClosed:"registration is the first week after a chart closes - this window has passed",PayoutClosed:"claims open in the second week after registration",NotRegistered:"nothing to claim here: not registered, or the dial did not beat the usd anchor",ClaimedAlready:"already done",SealWindowOver:"this border's 12h seal window has passed - the next border pays the bounty",SealedAlready:"already sealed",ChartOpen:"that border has not arrived yet",ChartUnsealed:"that chart is missing a sealed border - it rates nothing",RelayCooldown:"the flywheel turns at most once an hour",NothingToRelay:"the relay pot is empty",NothingToPurge:"no lapsed crystals in that list",CatchNotDeliverable:"a station cannot deliver in full - use WAIVE-EXIT only if it is permanently frozen",SinkFailed:"the $WATT payment failed - approve WATT first, and check the balance",TokenDoesNotExist:"no such receiver",Reentry:"busy - try again",NotDeployer:"deployer-only wiring call",WiredAlready:"the deck is already wired"},T={"0xf7760f25":"WrongPrice","0x52df9fe5":"SoldOut","0x94048683":"WalletCap","0xba092d16":"NotEOA","0x085de625":"TooEarly","0x0a2197af":"AlreadyWarm","0x78f71007":"StillCold","0x4a636d30":"NotYours","0x06f85798":"CrystalHeld","0x82a9853c":"CrystalSoulbound","0xb4b1eeef":"AccountNotEmpty","0x5f425364":"GainMaxed","0xbaebfacf":"RedlinedAlready","0x2dec7b38":"RedlineWindowClosed","0xb5e082c1":"RegisterClosed","0x86850dd8":"PayoutClosed","0xaba47339":"NotRegistered","0x15675431":"ClaimedAlready","0x8609b4b4":"SealWindowOver","0x9f1007f7":"SealedAlready","0x6589d482":"ChartOpen","0x791a42d3":"ChartUnsealed","0x467b4bde":"RelayCooldown","0xa6a2f67a":"NothingToRelay","0xba7385f6":"NothingToPurge","0x045dda23":"CatchNotDeliverable","0x00be8297":"SinkFailed","0xceea21b6":"TokenDoesNotExist","0x976f9b84":"Reentry","0x8b906c97":"NotDeployer","0xc0f11716":"WiredAlready"};function A(t){const e=String(t&&t.message||t);if(/user (denied|rejected)/i.test(e))return"signature declined";for(const t of Object.keys(I))if(e.includes(t))return I[t];const n=e.match(/0x[0-9a-fA-F]{8}/);if(n){const t=T[n[0].toLowerCase()];if(t)return I[t]||t}return/d857ba2b/.test(e)?"the mic is for operators - assemble a receiver first":/4ee45b56/.test(e)?"280 bytes - brevity is the soul of radio":/insufficient funds/i.test(e)?"not enough ETH for gas":e.length>160?e.slice(0,160)+"...":e}function M(t){const e=document.getElementById(t);e&&e.scrollIntoView({behavior:"smooth"}),"charts"===t&&z().catch(()=>{}),"receivers"===t&&L&&J().catch(()=>{}),"token"===t&&at().catch(()=>{})}async function R(e){try{const n=y(await C(t.deck,"0x"+a));if(0n===n)return;let o=j+e;o<1n&&(o=n),o>n&&(o=1n),v("heroCap").textContent="Tuning No."+String(o).padStart(4,"0")+"...",K(o)}catch(t){}}document.querySelectorAll("nav button").forEach(t=>t.onclick=()=>M(t.dataset.p)),v("getWatt").onclick=()=>M("token"),v("heroPrev").onclick=()=>R(-1n),v("heroNext").onclick=()=>R(1n);let L=null;function B(){const t=v("connBtn");t&&(t.textContent=L?L.slice(0,6)+"..."+L.slice(-4):"CONNECT",t.classList.toggle("live",!!L));const e=v("rxConnect"),n=v("rxReload");e&&n&&(e.style.display=L?"none":"",n.style.display=L?"":"none"),["rxSweep","rxSettle"].forEach(t=>{const e=v(t);e&&(e.style.display=L?"":"none")}),L&&v("rxHint")&&(v("rxHint").textContent="Operator "+L.slice(0,10)+"…"+L.slice(-6)),$().catch(()=>{})}async function $(){if(!N())return;const e=v("sMine"),n=v("sWatt");if(!L)return e&&(e.innerHTML="&mdash;"),void(n&&(n.innerHTML="&mdash;"));const[a,o]=await Promise.all([C(t.deck,g(i,w(L))),C(t.watt,g(i,w(L)))]);e&&(e.textContent=y(a).toString());const r=y(o)/10n**18n;n&&(n.textContent=r.toLocaleString("en-US"));const s=v("connBtn");var c;s&&L&&(s.textContent=L.slice(0,6)+"..."+L.slice(-4)+" · "+(c=r,((c=Number(c))>=1e9?(c/1e9).toFixed(2).replace(/\.?0+$/,"")+"B":c>=1e6?(c/1e6).toFixed(1).replace(/\.0$/,"")+"M":c>=1e3?(c/1e3).toFixed(1).replace(/\.0$/,"")+"K":String(c))+" WATT"))}async function D(){const e=await window.ethereum.request({method:"eth_chainId"});if(e&&e.toLowerCase()===t.chainId)return;S("tuning the wallet to "+t.chainName+"...");try{await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:t.chainId}]})}catch(e){await window.ethereum.request({method:"wallet_addEthereumChain",params:[{chainId:t.chainId,chainName:t.chainName,rpcUrls:t.rpc,nativeCurrency:{name:"Ether",symbol:"ETH",decimals:18},blockExplorerUrls:[t.explorer]}]}),await window.ethereum.request({method:"wallet_switchEthereumChain",params:[{chainId:t.chainId}]})}const n=await window.ethereum.request({method:"eth_chainId"});if(!n||n.toLowerCase()!==t.chainId)throw new Error("the wallet stayed on a foreign chain - switch to "+t.chainName+" by hand")}async function O(){if(L)return L;if(!window.ethereum)throw new Error("no wallet found - install one, or open in a wallet browser");const t=await window.ethereum.request({method:"eth_requestAccounts"});return L=t[0],await D(),B(),L}async function H(t,e,n=0n){await O(),await D();const a={from:L,to:t,data:e};n&&(a.value="0x"+n.toString(16)),await E("eth_call",[a,"latest"]);const o=await window.ethereum.request({method:"eth_sendTransaction",params:[a]});for(let t=0;t<120;t++){const t=await E("eth_getTransactionReceipt",[o]);if(t){if("0x1"!==t.status)throw new Error("transaction reverted");return t}await new Promise(t=>setTimeout(t,1500))}throw new Error("timed out waiting for the receipt")}async function W(e){y(await C(t.watt,g("dd62ed3e",w(L),w(t.deck))))>=e||(S("approving WATT once..."),await H(t.watt,g("095ea7b3",w(t.deck),f(1n<<255n))))}async function P(){if(N())try{const e=y(await C(t.deck,"0x"+a)),n=y(await C(t.deck,"0xcb4f1c18"));v("sMint").textContent=`${e} / 4444`,v("sLive").textContent=`${n}`,e>=m&&(v("mintBtn").disabled=!0,v("mintBtn").textContent="SOLD OUT - THE SHELF IS EMPTY")}catch(t){}}let U=null;const F=new TextDecoder;function q(t,e){const n=t.replace(/^0x/,""),a=2*Number(BigInt("0x"+n.slice(64*e,64*e+64))),o=Number(BigInt("0x"+n.substr(a,64))),r=new Uint8Array(o);for(let t=0;t<o;t++)r[t]=parseInt(n.substr(a+64+2*t,2),16);return F.decode(r)}async function _(e,n,a,o){const r=await async function(){if(U)return U;const e="0x"+(await C(t.deck,"0x"+d)).slice(26),n="0x"+(await C(e,"0x2e2d3e6b")).slice(26),a="0x"+(await C(n,"0xfd6af7c0")).slice(26);return U={ren:e,cha:n,eng:a}}(),s=a?10n:y(await C(t.plates,g("877e94bd",f(e),p(n))));o&&o(1);const c=await C(r.ren,g("88b416ed",f(e),p(n),f(s)),!0);o&&o(2);const i=await C(r.cha,g("a974aaf9",f(e),p(n),f(s)),!0),l=BigInt("0x"+i.replace(/^0x/,"").slice(64,128));o&&o(3);const h="u"+e;let u="";for(const t of h)u+=t.charCodeAt(0).toString(16).padStart(2,"0");const m=await C(r.eng,"0xd0f0dadb"+f(l)+f(s)+f(0x60n)+f(BigInt(h.length))+u.padEnd(64,"0"),!0),w=BigInt("0x"+m.replace(/^0x/,"").slice(64,128));o&&o(4);const x=await C(r.cha,g("43931650",f(e),p(n),f(s),f(w)),!0);return q(c,0)+q(i,0)+q(m,0)+q(x,0)+q(c,1)}const V=t=>"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(t);async function G(){if(N())try{const o=y(await C(t.deck,"0x"+a));if(0n===o)return;const r=1n+BigInt(Math.floor(Math.random()*Number(o))),s=await C(t.deck,g(e,f(r)));let c;if(0n===y(s)){const e=k(await C(t.deck,g(n,f(r)),!0));c=JSON.parse(atob(e.split(",")[1])).image}else c=V(await _(r,s,!1,t=>{v("heroCap").textContent=`tuning the picture from the chain... ${t}/4`}));Y(r,`RECEIVER No.${String(r).padStart(4,"0")} - live from the chain`,c)}catch(t){v("heroCap").textContent="the carrier did not tune - reload to retry"}}let j=1n;function Y(t,e,n){j=BigInt(t);const a=v("hero");a.innerHTML="";const o=document.createElement("img");o.alt="RECEIVER No."+t,o.src=n,a.appendChild(o),v("heroCap").textContent=e}async function K(a){try{const o=await C(t.deck,g(e,f(a)));let r;if(0n===y(o)){const e=k(await C(t.deck,g(n,f(a)),!0));r=JSON.parse(atob(e.split(",")[1])).image}else r=V(await _(a,o,a>m,t=>{v("heroCap").textContent=`tuning your picture... ${t}/4`}));Y(a,`RECEIVER No.${String(a).padStart(4,"0")} - yours`,r)}catch(t){}}async function Q(){const e=new Set,n=(await async function(e){const n=BigInt(await E("eth_blockNumber",[])),a=BigInt(t.birthBlock),o=[h,null,"0x"+e],r=[h,"0x"+e,null],s=(e,n)=>({fromBlock:"0x"+e.toString(16),toBlock:"0x"+n.toString(16),address:t.deck});try{const[t,e]=await Promise.all([E("eth_getLogs",[{...s(a,n),topics:o}],1),E("eth_getLogs",[{...s(a,n),topics:r}],1)]);return[...t.map(t=>({l:t,in:!0})),...e.map(t=>({l:t,in:!1}))]}catch(t){}const c=[];let i=1000000n,l=a;for(;l<=n;){const t=l+i-1n>n?n:l+i-1n;try{const[e,n]=await Promise.all([E("eth_getLogs",[{...s(l,t),topics:o}],1),E("eth_getLogs",[{...s(l,t),topics:r}],1)]);c.push(...e.map(t=>({l:t,in:!0})),...n.map(t=>({l:t,in:!1}))),l=t+1n,i<1000000n&&(i*=2n)}catch(t){if(i<=10000n)throw t;i/=2n,await b(300)}}return c}(w(L))).sort((t,e)=>Number(BigInt(t.l.blockNumber)-BigInt(e.l.blockNumber))||Number(BigInt(t.l.logIndex)-BigInt(e.l.logIndex)));for(const{l:t,in:a}of n){const n=BigInt(t.topics[3]);a?e.add(n):e.delete(n)}return[...e].sort((t,e)=>Number(t-e))}v("mintBtn").onclick=async()=>{const n=v("mintMsg");n.className="msg",n.textContent="";try{if(!N())throw new Error("the deck is not on air yet");await O(),n.textContent="dry-running the assembly...";const a=await H(t.deck,"0x242d481b",t.price);let o=null;for(const e of a.logs)e.address.toLowerCase()===t.deck.toLowerCase()&&e.topics[0]===h&&4===e.topics.length&&(o=BigInt(e.topics[3]));n.className="msg ok",n.textContent=`RECEIVER No.${String(o).padStart(4,"0")} assembled. Tubes warming...`,async function(n){v("warmTrack").style.display="block";const a=Date.now(),o=async()=>{const r=Math.min((Date.now()-a)/15e4,1);v("warmBar").style.width=(100*r).toFixed(0)+"%";try{const a=await C(t.deck,g(e,f(n)));if(0n!==y(a))return v("warmBar").style.width="100%",v("warmLbl").textContent="ON AIR - tuning 0x"+a.slice(2,18),S(`RECEIVER No.${n} is ON AIR`),void K(n)}catch(t){}v("warmLbl").textContent="TUBES WARMING - the broom passes ~every 2 min",setTimeout(o,12e3)};o()}(o)}catch(t){n.className="msg err",n.textContent=A(t)}},v("crystalBtn").onclick=async()=>{const e=v("mintMsg");e.className="msg";try{if(!N())throw new Error("the deck is not on air yet");if(await O(),0n!==y(await C(t.deck,g("b584a54b",w(L)))))throw new Error("CrystalHeld");const n=await H(t.deck,"0x95c75a3b");let a=null;for(const t of n.logs)t.topics&&t.topics[0]===h&&4===t.topics.length&&(a=BigInt(t.topics[3]));e.className="msg ok",e.textContent=`CRYSTAL SET No.${a} lit - no power, 1 hour, honestly weak.`,K(a)}catch(t){e.className="msg err",e.textContent=A(t)}};let X=0;async function J(){const a=++X,o=v("rxCards");v("rxMsg").className="msg",v("rxMsg").textContent="reading the log book...";try{const r=await Q();if(a!==X)return;v("rxMsg").textContent=r.length?"":"no receivers on this bench yet - assemble one on the ON AIR page.";const l=y(await C(t.deck,"0x973628f6")),d=BigInt(Math.floor(Date.now()/1e3)),h=d%u,p=h<604800n,x=t=>{const e=Number(t)/86400|0;return(e?e+"d ":"")+(Number(t)%86400/3600|0)+"h "+(Number(t)%3600/60|0)+"m"},b=await Promise.all(r.map(async n=>{const a=n>m,[o,r,s,c]=await Promise.all([C(t.deck,g(e,f(n))),a?null:C(t.deck,g("49f3fc62",f(n))),C(t.deck,g("dc7342de",f(n))),a?C(t.deck,g("7e732812",f(n))):null]);return{id:n,crystal:a,g:o,cold:!a&&0n===y(o),gs:r?y(r):0n,due:y(s)<l,xe:c?y(c):0n}}));if(a!==X)return;const N=document.createDocumentFragment(),S=[];for(const e of b){const{id:n,crystal:a,g:o,cold:r,gs:l}=e,m=document.createElement("div");m.className="card";const b=`<div class="nocarrier" data-art="${n}"><b>No.${String(n).padStart(4,"0")}</b>\n          <span class="artwait">TUNING THE PICTURE...</span>\n          <span>TUNING 0x${o.slice(2,18)}</span>\n          <a target="_blank" rel="noopener noreferrer" href="${t.explorer}/token/${t.deck}/instance/${n}">OPEN IN EXPLORER</a></div>`,k=a&&d>e.xe;let v=a?k?'<span class="tag hot">CRYSTAL · FADED</span>':'<span class="tag">CRYSTAL SET</span>':r?'<span class="tag hot">COLD TUBES</span>':'<span class="tag live">ON AIR</span>';!a&&!r&&l>0n&&(v+=` <span class="tag">GAIN +${3n*l}dB</span>`),m.innerHTML=`${b}\n        <div class="cid"><b>No.${String(n).padStart(4,"0")}</b><span>${v}</span></div>\n        <div class="ops"></div><div class="msg"></div>`,S.push({id:n,card:m});const I=m.querySelector(".ops"),T=m.querySelector(".msg");let M=I;const R=(t,e,n,a)=>{const o=document.createElement("button");if(o.className="btn ghost"+(n?" warn":""),o.textContent=t,a){o.disabled=!0,o.style.opacity=".45",o.style.cursor="not-allowed",o.title=a;const e=document.createElement("div");return e.className="st",e.textContent=t.toLowerCase()+": "+a,M.appendChild(o),M.appendChild(e),o}return o.onclick=async()=>{T.className="msg",T.textContent="...";try{await e(),T.className="msg ok",T.textContent="done",J()}catch(t){T.className="msg err",T.textContent=A(t)}},M.appendChild(o),o};if(a){const t=e.xe>d?e.xe-d:0n,n=t?`${Number(t)/3600|0}h ${Number(t)%3600/60|0}m`:null;m.querySelector(".cid").insertAdjacentHTML("afterend",k?'<div class="st">faded - it heard an hour of charts and went quiet. anyone may sweep the husk.</div>':`<div class="st pulse">soulbound &middot; rates nothing &middot; fades in ${n}</div>`)}else if(e.cold)e.due?R("WARM NOW",()=>H(t.deck,g("7abaf46c",f(n)))):m.querySelector(".cid").insertAdjacentHTML("afterend",'<div class="st pulse">warming with the next era...</div>');else if(!a){l<4n&&R("GAIN +3dB",async()=>{const e=y(await C(t.deck,g(c,f(l)))),a=0n===l?0n:y(await C(t.deck,g(c,f(l-1n))));await W(e-a),await H(t.deck,g("b8c20926",f(n)))}),R("REDLINE",async()=>{await W(25000n*10n**18n),await H(t.deck,g("f0fa13fb",f(n)))},!1,p?null:"the red window is the first 7 days of a chart - opens again in "+x(u-h));const e=document.createElement("div");e.style.display="none";const a=document.createElement("button");a.className="btn ghost",a.textContent="MORE ▾",a.onclick=()=>{const t="none"===e.style.display;e.style.display=t?"":"none",a.textContent=t?"LESS ▴":"MORE ▾"},I.appendChild(a),I.appendChild(e),M=e,R("VAULT",async()=>{const e=await C(t.deck,g(s,f(n)));window.open(t.explorer+"/address/0x"+e.slice(26),"_blank")});const o=async()=>{const e="0x"+(await C(t.deck,g(s,f(n)))).slice(26),[a,o]=await Promise.all([E("eth_getBalance",[e,"latest"]),C(t.watt,g(i,w(e)))]),r=y(a),c=y(o)/10n**18n;return r||c?`\n\nITS VAULT IS NOT EMPTY: ${r?(Number(r)/1e18).toFixed(5)+" ETH":""}${r&&c?" + ":""}${c?c.toLocaleString("en-US")+" WATT":""} still inside (stations may sit there too - VAULT shows everything).`:"\n\nETH and WATT read empty; stations may still sit inside - VAULT shows everything."};R("SIGN OFF",async()=>{const e=await o();if(!confirm(`SIGN-OFF is forever. Receiver No.${n} burns.${e}\n\nWithdraw EVERYTHING first - after the burn the 6551 account can no longer be commanded and whatever is left is stranded. Pending catch pays out to you. Proceed?`))throw new Error("cancelled");await H(t.deck,g("05bd87a7",f(n)))},!0),R("WAIVE-EXIT",async()=>{const e=await o();if(!confirm(`WAIVING SIGN-OFF is the emergency door for a receiver stuck on a FROZEN station.${e}\n\nIt burns No.${n}, delivers every station that still moves, and PERMANENTLY FORFEITS anything frozen or stranded in the 6551. Use only if a normal SIGN OFF reverts. Proceed?`))throw new Error("cancelled");await H(t.deck,g("618cf9b5",f(n)))},!0),M=I}N.appendChild(m)}o.replaceChildren(N),(async()=>{for(const e of b){if(a!==X)return;const{id:o,card:r}=S.find(t=>t.id===e.id)||{};if(!r)continue;const s=r.querySelector(".artwait");try{let a;if(e.cold){const e=k(await C(t.deck,g(n,f(o)),!0));a=JSON.parse(atob(e.split(",")[1])).image}else a=V(await _(o,e.g,e.crystal,t=>{s&&(s.textContent=`TUNING THE PICTURE... ${t}/4`)}));const c=r.querySelector(`[data-art="${o}"]`);if(c&&a){const t=document.createElement("img");t.loading="lazy",t.src=a,c.replaceWith(t)}}catch(t){s&&(s.textContent="THE PICTURE DID NOT TUNE - reload to retry")}}})()}catch(t){a===X&&(v("rxMsg").className="msg err",v("rxMsg").textContent=A(t))}}async function z(){if(!N())return void(v("cMsg").textContent="the deck is not on air yet");const e=BigInt(Math.floor(Date.now()/1e3));let n;try{n=y(await C(t.deck,"0x"+o))}catch(t){n=e/u}v("cNow").textContent="No."+n;const a=Number((n+1n)*u-e),s=Math.floor(a/86400),c=Math.floor(a%86400/3600),i=Math.floor(a%3600/60);v("cCount").textContent=`${s}d ${c}h ${i}m`;const l=y(await C(t.deck,g(r,f(n)))),d=e%u<=43200n,h=v("sealBtn");l?(v("cSeal").textContent="SEALED",h&&(h.disabled=!0,h.style.opacity=".45",h.title="this border is already sealed")):d?(v("cSeal").textContent="OPEN - first keeper takes 1,000 WATT",h&&(h.disabled=!1,h.style.opacity="",h.title="")):(v("cSeal").textContent="WINDOW MISSED - this chart rates nothing; the next border opens the next window",h&&(h.disabled=!0,h.style.opacity=".45",h.title="the 12h seal window after the border has passed"));const w=y(await C(t.deck,g("243900e0",f(n-1n))));if(v("cEdge").textContent=w?w.toString():"-",L){v("cMsg").textContent="reading your dials...";try{const a=(await Q()).filter(t=>t<=m),o=n-1n,s=v("cRows");s.innerHTML="";let c=null;try{c=0n!==y(await C(t.deck,g(r,f(o))))}catch(t){}for(const r of a){let a="-",i="-",l="";if(!1===c){i="BORDER UNSEALED - nobody rang the bell, the chart rated nothing";const t=document.createElement("tr");t.innerHTML=`<td>No.${String(r).padStart(4,"0")}</td><td class="num noi">-</td><td>${i}</td><td></td>`,s.appendChild(t);continue}try{const s=BigInt.asIntN(256,y(await C(t.deck,g("09815f88",f(r),f(o)))));a=s.toString();const c=y(await C(t.deck,g("01e84235",f(o),f(r)))),d=y(await C(t.deck,g("ada2db71",f(o),f(r)))),h=n*u+604800n;d?i="CLAIMED":c>0n?(i="REGISTERED",e>=h&&(l="claim")):s>0n&&e<h?(i="ELIGIBLE",l="enter"):i=s>0n?"MISSED THE WINDOW":"BELOW THE ANCHOR"}catch(t){i=c?"NODE HICCUP - reload the tab":"BORDER UNSEALED"}const d=document.createElement("tr");if(d.innerHTML=`<td>No.${String(r).padStart(4,"0")}</td><td class="num ${"-"!==a&&BigInt(a)>0n?"sig":"noi"}">${a}</td><td>${i}</td><td></td>`,l){const e=document.createElement("button");e.className="btn ghost",e.textContent="enter"===l?"REGISTER":"CLAIM WATT",e.onclick=async()=>{try{await H(t.deck,g("enter"===l?"d8b9633c":"3ac2454e",f(r),f(o))),S("done"),z()}catch(t){S(A(t))}},d.lastElementChild.appendChild(e)}s.appendChild(d)}v("cTable").style.display=a.length?"table":"none",v("cMsg").textContent=a.length?"":"no receivers yet"}catch(t){v("cMsg").className="msg err",v("cMsg").textContent=A(t)}}else v("cMsg").textContent="connect the wallet on RECEIVERS to see your standings"}async function Z(){const e=v("wavesFeed");if(e&&N())try{const n=await E("eth_getLogs",[{address:t.waves,topics:["0xab283aa70a9d97e230a00e70f18713971743ed6c25a52daa4bf61605e53a5128"],fromBlock:"0x"+BigInt(t.birthBlock).toString(16),toBlock:"latest"}]);e.replaceChildren();const a=n.slice(-24).reverse();if(!a.length)return void(e.textContent="silence on the band - key the first transmission");for(const t of a){const n="0x"+t.topics[1].slice(26),a=document.createElement("div");a.className="tr";const o=document.createElement("span");o.className="blk",o.textContent="#"+parseInt(t.blockNumber,16),a.appendChild(o);const r=document.createElement("span");r.className="who",r.textContent=n.slice(0,6)+"…"+n.slice(-4);const s=document.createElement("span");s.className="say",s.textContent=q(t.data,0),a.append(r,s),e.appendChild(a)}}catch(t){e.textContent="the band is noisy - reload to retune"}}v("rxConnect").onclick=async()=>{try{await O(),J()}catch(t){v("rxMsg").className="msg err",v("rxMsg").textContent=A(t)}},v("rxReload").onclick=()=>J(),v("connBtn").onclick=async()=>{try{await O(),J(),z().catch(()=>{})}catch(t){S(A(t))}},v("sealBtn").onclick=async()=>{try{const e=y(await C(t.deck,"0x"+o));await H(t.deck,g("e388f5a2",f(e))),S("border sealed - the bounty is yours"),z()}catch(t){S(A(t))}},v("wavesTx").onclick=async()=>{const e=v("wavesMsg");e.className="msg",e.textContent="";try{if(!N())throw new Error("the deck is not on air yet");await O();const n=v("wavesIn").value.trim();if(!n)throw new Error("nothing to transmit");const a=(new TextEncoder).encode(n);if(a.length>280)throw new Error("280 bytes - brevity is the soul of radio");let o="";for(const t of a)o+=t.toString(16).padStart(2,"0");o=o.padEnd(64*Math.ceil(a.length/32),"0"),await H(t.waves,"0x49cf3daa"+f(0x20n)+f(BigInt(a.length))+o),e.className="msg ok",e.textContent="on air - forever",v("wavesIn").value="",Z()}catch(t){e.className="msg err",e.textContent=A(t)}},v("wavesIn").addEventListener("keydown",t=>{"Enter"===t.key&&v("wavesTx").click()}),Z(),setInterval(Z,45e3);let tt=null,et=0n,nt=0n;async function at(){if(N())try{const e=1000000000n*10n**18n-y(await C(t.watt,"0x18160ddd"));v("tBurned").textContent=(e/10n**18n).toLocaleString("en-US")+" WATT";const n=await C(t.deck,"0x03eadcfc");if(!n||n.length<66)throw new Error("the well is off the air - deck not found on this chain");tt="0x"+n.slice(26);const a=y(await C(tt,g(l,f(10n**18n))));v("tRate").textContent=(a/10n**18n).toLocaleString("en-US")+" WATT";const o=y(await C(t.deck,"0xea16a73b"));if(v("tPot").textContent=(Number(o)/1e18).toFixed(5)+" ETH",L){const e=y(await C(t.watt,g(i,w(L))));v("tMine").textContent=(e/10n**18n).toLocaleString("en-US")}ot()}catch(t){v("tMsg").className="msg err",v("tMsg").textContent=A(t)}}async function ot(){try{if(!tt)return;const t=parseFloat((v("tEth").value||"0").replace(",","."));if(!(t>0))return v("tQuote").textContent="--",void(et=0n);nt=BigInt(Math.round(1e6*t))*10n**12n,et=y(await C(tt,g(l,f(nt)))),v("tQuote").textContent="≈ "+(et/10n**18n).toLocaleString("en-US")+" WATT"}catch(t){v("tQuote").textContent="--",et=0n}}function rt(t,e=1){let n=2e3+Math.floor(7e3*t[0]/255)-Math.floor(1500*t[3]/255);n<500&&(n=500);const a=[];let o=0;for(let n=0;n<e;n++){const r=256+t[4]*(e-1-n);a.push(r),o+=r}const r=a.map(t=>Math.floor(n*t/o));return r.push(1e4-r.reduce((t,e)=>t+e,0)),r}v("tEth").oninput=()=>{ot()},v("tBuy").onclick=async()=>{const t=v("tMsg");t.className="msg",t.textContent="...";try{if(!N())throw new Error("the deck is not on air yet");if(await O(),await ot(),!et)throw new Error("set an ETH amount first");await H(tt,g("c710efb9",f(99n*et/100n),w(L)),nt),t.className="msg ok",t.textContent="power delivered — "+(et/10n**18n).toLocaleString("en-US")+" WATT on your line",$(),at()}catch(e){t.className="msg err",t.textContent=A(e)}},v("rxSweep").onclick=async()=>{const e=v("rxMsg");e.className="msg",e.textContent="sweeping the bench...";try{await O(),await H(t.deck,g("3e0aa5e4",f(50n))),e.className="msg ok",e.textContent="swept — every due receiver warmed, the bounty is yours",J(),$()}catch(t){e.className="msg err",e.textContent=A(t)}},v("rxSettle").onclick=async()=>{const e=v("rxMsg");try{await O();const n=(await Q()).filter(t=>t<=m);if(!n.length)throw new Error("no receivers on this bench");let a=0;for(const o of n)e.className="msg",e.textContent=`settling No.${o} (${++a}/${n.length})...`,await H(t.deck,g("8df82800",f(o)));e.className="msg ok",e.textContent="all catches delivered to the receiver vaults",J()}catch(t){e.className="msg err",e.textContent=A(t)}};let st=[200,240,60,30,230,40,200,120];const ct=v("knobs");function it(){const t="0x"+st.map(t=>t.toString(16).padStart(2,"0")).join("");v("wbHex").textContent=t;const e=rt(st,2),n=["kBTC","WETH","USD₮0"];var a;v("wbBars").innerHTML=e.map((t,a)=>`<div class="lbl"><span>${n[a]||"ST"+a}</span><span>${(t/100).toFixed(2)}%</span></div>\n     <div class="bar${a===e.length-1?" u":""}"><i style="width:${t/100}%"></i></div>`).join(""),v("wbPhase").textContent=st[5]>127?"PHASE-INVERTED (rides against last winners)":"IN-PHASE (rides last winners)",v("wbRed").textContent="x"+(a=st,(100+Math.floor(300*a[1]/255))/100).toFixed(2),v("wbMsg").textContent="",v("wbMsg").className="msg"}["ANTENNA","WATTAGE","DWELL","SQUELCH","FREQUENCY","PHASE","DRIFT","SKIP"].forEach((t,e)=>{const n=document.createElement("label");n.innerHTML=`${t} <span class="sub" id="kv${e}">${st[e]}</span>`;const a=document.createElement("input");a.type="range",a.min=0,a.max=255,a.value=st[e],a.oninput=()=>{st[e]=+a.value,v("kv"+e).textContent=a.value,it()},ct.appendChild(n),ct.appendChild(a)}),v("wbRandom").onclick=()=>{st=st.map(()=>Math.floor(256*Math.random())),document.querySelectorAll("#knobs input").forEach((t,e)=>{t.value=st[e],v("kv"+e).textContent=st[e]}),it()},v("wbVerify").onclick=async()=>{const e=v("wbMsg");try{if(!N())throw new Error("the deck is not on air yet - the local dial IS the same math");const n=st.map(t=>t.toString(16).padStart(2,"0")).join(""),a=(t=>{const e=t.replace(/^0x/,""),n=[];for(let t=0;t<e.length;t+=64)n.push(BigInt("0x"+e.slice(t,t+64)));return n})(await C(t.deck,g("54791c7e",p(n)))),o=Number(a[1]),r=a.slice(2,2+o).map(Number),s=rt(st,o-1),c=r.length===s.length&&r.every((t,e)=>t===s[e]);e.className="msg "+(c?"ok":"err"),e.textContent=c?"VERIFIED - the deck computes exactly these weights":"MISMATCH: "+r.join(",")}catch(t){e.className="msg err",e.textContent=A(t)}},it(),v("fExp").href=t.explorer,v("fDex").href="https://dexscreener.com/ink/"+t.pool,v("fCopy").onclick=e=>{e.preventDefault(),navigator.clipboard.writeText(t.deck).then(()=>S("deck address copied")).catch(()=>S(t.deck))};const lt="https://opensea.io/collection/"+t.os;function dt(){const t=v("sBorder");if(!t)return;const e=BigInt(Math.floor(Date.now()/1e3)),n=Number((e/u+1n)*u-e),a=Math.floor(n/86400),o=Math.floor(n%86400/3600),r=Math.floor(n%3600/60),s=Math.floor(n%60);t.textContent=`${a}d ${o}h ${r}m ${String(s).padStart(2,"0")}s`}v("osLink").href=lt,v("fOs").href=lt,v("pfD").href=t.explorer+"/address/"+t.deck+"?tab=contract",v("pfW").href=t.explorer+"/address/"+t.watt,v("pfP").href=t.explorer+"/address/0x000000000000000000000000000000000000dEaD",N()&&C(t.deck,"0x"+d).then(e=>{v("pfR").href=t.explorer+"/address/0x"+e.slice(26)}).catch(()=>{}),N()&&(v("manAddrs").innerHTML=`THE RECEIVER DECK &mdash; assembles, rates and pays every set<br><a target="_blank" rel="noopener noreferrer" href="${t.explorer}/address/${t.deck}">${t.deck}</a><br>THE POWER LINE &mdash; $WATT, what the bench runs on<br><a target="_blank" rel="noopener noreferrer" href="${t.explorer}/address/${t.watt}">${t.watt}</a>`),P(),G(),setInterval(P,3e4),setInterval(G,5e4),z().catch(()=>{}),at().catch(()=>{}),setInterval(()=>{z().catch(()=>{}),at().catch(()=>{})},6e4),dt(),setInterval(dt,1e3),window.ethereum||document.querySelector("header").insertAdjacentHTML("afterend",'<div class="wrap" style="padding:10px 0"><div class="msg" style="display:block">no wallet extension in this browser &mdash; on a phone, open this site from inside your wallet app&#39;s own browser.</div></div>'),window.ethereum&&(window.ethereum.request({method:"eth_accounts"}).then(t=>{t&&t[0]&&(L=t[0],B(),J())}).catch(()=>{}),window.ethereum.on&&window.ethereum.on("accountsChanged",t=>{L=t&&t[0]||null,B(),L?J():(v("rxCards").replaceChildren(),v("rxHint").textContent="Connect your wallet to see your receivers.")})),function(){const e=t=>document.getElementById(t);document.querySelectorAll("section").forEach(t=>t.classList.add("on"));const n={onair:"onair",receivers:"receivers",charts:"charts",workbench:"workbench",token:"token",manual:"manual"};document.querySelectorAll("nav button").forEach(t=>{t.addEventListener("click",()=>{const a=e(n[t.dataset.p]);a&&a.scrollIntoView({behavior:"smooth"})},!0)});const a=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&document.querySelectorAll("nav button").forEach(e=>e.classList.toggle("on",e.dataset.p===t.target.id))})},{rootMargin:"-45% 0px -50% 0px"});function o(){const t=t=>{const n=e(t);return n?n.textContent:"--"},n=[["ASSEMBLED",t("sMint")],["STILL ON AIR",t("sLive")],["BORDER",t("sBorder")],["PRICE","0.0005 ETH"],["CAP","2 / WALLET"],["PAIR","$WATT / USD₮0"],["THE MARKET","IS ON AIR"]].map(([t,e])=>`<span>${t} <b>${e}</b></span>`).join("");e("tick").innerHTML=n+n}Object.values(n).forEach(t=>{const n=e(t);n&&a.observe(n)}),o(),setInterval(o,6e3);const r=e("heroWrap"),s=e("hero");r&&s&&matchMedia("(pointer:fine)").matches&&(r.style.perspective="1100px",r.addEventListener("mousemove",t=>{const e=r.getBoundingClientRect();s.style.transform=`rotateY(${4*((t.clientX-e.left)/e.width-.5)}deg) rotateX(${3*-((t.clientY-e.top)/e.height-.5)}deg)`}),r.addEventListener("mouseleave",()=>{s.style.transform=""}));const c=document.getElementById("wattCA");c&&(c.textContent=t.watt);const i=new IntersectionObserver(t=>t.forEach(t=>{t.isIntersecting&&(t.target.classList.add("in"),i.unobserve(t.target))}),{threshold:.1});document.querySelectorAll(".rev").forEach(t=>i.observe(t))}();</script>
</body>
</html>
