The owner's orders of 7 October 2026 (header, logos, footer, phone scene) and the Counter ASIC lane's public text (docs/plans/counter-asic-3-public-text-2026-10-07.md,b10c7ac2) with the disclosure prize held back until its publish word. Header: the one-screen home no longer hides items; the sheet carries exactly Litepaper, Miner, App, Wallet, Live devnet, Ledger and Download; 44 px bar links, 48 px sheet rows, the burger turns into an X; tools/ci/site-nav-check.mjs runs after every build and in the gate. Cards: the Windows four-pane, Apple and Tux marks from80c5618, white on the ember card, the card's own text colour on the mono cards (so they flip with the theme). Footer: the ledger page renders through tools/ledger-page.mjs and now underlines Ledger; the Reddit profile is the one the owner named. Renderer: narrow, narrowBreak 720, narrowWindow 30, narrowLanes 4, narrowMinNode 11; hairlines off except the selected chain; checkpoint labels as the percent; fps 60 on the home and /live mounts. Measured in headless chromium at 390 with 4x CPU throttling: 50 to 56 frames a second (the cap is 60). Evidence row 17 rewritten in the table's eight columns. The forbidden list gains "disclosure prize" and the word-bounded rig names. Tested with Playwright at 390 and 768 in both themes with real taps on every public page and the 404: 48 rows, 0 problems; captures in docs/plans/site-ui-4-shots/chrome. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
243 lines
20 KiB
HTML
243 lines
20 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
<title>Igneum testnet faucet. 10 IGN a day for testing</title>
|
|
<meta name="description" content="Testnet IGN for developers and miners: 10 IGN per address per day, no value, no account. Paste an address, get a transaction hash.">
|
|
<link rel="canonical" href="https://igneum.network/faucet">
|
|
<meta name="theme-color" content="#0C0C0E">
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:site_name" content="Igneum">
|
|
<meta property="og:title" content="Igneum testnet faucet">
|
|
<meta property="og:description" content="Testnet IGN for developers and miners: 10 IGN per address per day, no value, no account.">
|
|
<meta property="og:url" content="https://igneum.network/faucet">
|
|
<meta property="og:image" content="https://igneum.network/og.png?v=3">
|
|
<meta property="og:image:width" content="1200">
|
|
<meta property="og:image:height" content="630">
|
|
<meta property="og:image:alt" content="Igneum. Mined by GPUs. Proven by fire.">
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta name="twitter:title" content="Igneum testnet faucet">
|
|
<meta name="twitter:description" content="Testnet IGN for developers and miners: 10 IGN per address per day, no value, no account.">
|
|
<meta name="twitter:image" content="https://igneum.network/og.png?v=3">
|
|
<link rel="icon" href="/favicon.ico" sizes="48x48">
|
|
<link rel="icon" href="/favicon-32.png" type="image/png" sizes="32x32">
|
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
|
|
<link rel="manifest" href="/site.webmanifest">
|
|
<!-- head:start -->
|
|
<link rel="preload" href="/fonts/unbounded-900.woff2" as="font" type="font/woff2" crossorigin>
|
|
<link rel="preload" href="/fonts/plex-sans-400.woff2" as="font" type="font/woff2" crossorigin>
|
|
<link rel="stylesheet" href="/site.css">
|
|
<style>
|
|
/* Shared by every page: the head partial, injected by the build between the head markers. Edit the partial, not the page. */
|
|
/* Fonts, self-hosted (latin subsets, OFL): Unbounded 500/700/900, IBM Plex Sans 400/500/600, IBM Plex Mono 400/500. Fallbacks carry size and ascent overrides so the swap does not move the layout. The tokens, type and components are in /site.css (docs/plans/site-ui-3.md). */
|
|
@font-face{font-family:'Unbounded';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/unbounded-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'Unbounded';font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/unbounded-700.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'Unbounded';font-style:normal;font-weight:900;font-display:swap;src:url(/fonts/unbounded-900.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-sans-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-sans-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'IBM Plex Sans';font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/plex-sans-600.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/plex-mono-400.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/plex-mono-500.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
|
|
@font-face{font-family:'Unbounded Fallback';src:local('Arial Black'),local('Arial-Black'),local('Impact');size-adjust:114%;ascent-override:87.5%;descent-override:21.5%;line-gap-override:0%}
|
|
@font-face{font-family:'Plex Sans Fallback';src:local('Arial'),local('Helvetica Neue'),local('Helvetica');size-adjust:100.5%;ascent-override:102%;descent-override:27.4%;line-gap-override:0%}
|
|
@font-face{font-family:'Plex Mono Fallback';src:local('Courier New'),local('Menlo');size-adjust:100%;ascent-override:102.5%;descent-override:27.5%;line-gap-override:0%}
|
|
</style>
|
|
<script>
|
|
/* theme before first paint: the footer control stores "light" or "dark" under igneum-theme; nothing stored means the system setting */
|
|
(function(){try{var t=localStorage.getItem("igneum-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();
|
|
</script>
|
|
<!-- head:end -->
|
|
<style>
|
|
/* page block; tokens, type and components are in /site.css */
|
|
main{flex:1}
|
|
.head{padding-top:var(--sec);padding-bottom:32px}
|
|
.grid{display:grid;gap:24px;grid-template-columns:minmax(0,1fr)}
|
|
@media(min-width:900px){.grid{grid-template-columns:minmax(0,1.2fr) minmax(0,.8fr);gap:40px}}
|
|
form{display:flex;flex-direction:column;gap:12px;margin-top:16px}
|
|
label{font-size:14px;color:var(--ash)}
|
|
input{width:100%;min-height:52px;padding:12px 14px;border-radius:12px;border:1px solid var(--line-2);background:var(--obsidian);color:var(--bone);font:500 16px/1.3 var(--f-mono);letter-spacing:.01em}
|
|
input:focus{outline:2px solid var(--ember);outline-offset:2px;border-color:var(--ember)}
|
|
.btn[disabled]{opacity:.6;cursor:default;transform:none}
|
|
.status{min-height:28px;margin-top:4px;font-size:15px;color:var(--ink-2);overflow-wrap:anywhere}
|
|
.status[data-state="ok"]{color:var(--ok)}
|
|
.status[data-state="bad"]{color:var(--bad)}
|
|
.status code{font-family:var(--f-mono);font-size:14px;background:var(--obsidian);padding:1px 6px;border-radius:6px}
|
|
.rules{display:grid;gap:12px;margin-top:8px}
|
|
.rule{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:var(--obsidian)}
|
|
.rule b{display:block;font-weight:600;color:var(--bone)}
|
|
.rule span{font-size:14px;color:var(--ash)}
|
|
.num{font-family:var(--f-mono);font-size:12px;color:var(--ember);padding-top:4px;min-width:22px}
|
|
.notice{margin-top:14px;padding:12px 14px;border-radius:12px;border:1px dashed var(--line-2);font-size:14px;color:var(--molten)}
|
|
dl{display:grid;grid-template-columns:auto 1fr;gap:6px 16px;margin:14px 0 0;font-size:15px}
|
|
dt{color:var(--ash)}dd{margin:0;font-family:var(--f-mono);font-size:14px;overflow-wrap:anywhere}
|
|
@media (prefers-reduced-motion:reduce){.btn:hover{transform:none}}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<!-- nav:start -->
|
|
<a class="skip" href="#main">Skip to content</a>
|
|
<nav class="nav" aria-label="Main">
|
|
<div class="wrap">
|
|
<a href="/" class="brand" aria-label="Igneum home">
|
|
<svg class="mark" viewBox="0 0 1024 1024" width="28" height="28" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg>
|
|
<span class="word">IGNEUM</span>
|
|
</a>
|
|
<div class="links" id="nav-links">
|
|
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
|
<a href="/miner" data-nav="miner">Miner</a>
|
|
<a href="/app" data-nav="app">App</a>
|
|
<a href="/wallet" data-nav="wallet">Wallet</a>
|
|
<a href="/live" data-nav="live">Live devnet</a>
|
|
<a href="/ledger" data-nav="ledger">Ledger</a>
|
|
</div>
|
|
<a href="/miner#get" class="btn primary small cta">Download</a>
|
|
<button class="burger" id="nav-burger" type="button" aria-expanded="false" aria-controls="nav-sheet" aria-label="Open the menu" aria-haspopup="true"><span class="bars" aria-hidden="true"></span></button>
|
|
<div class="nav-sheet" id="nav-sheet">
|
|
<a href="/litepaper" data-nav="litepaper">Litepaper</a>
|
|
<a href="/miner" data-nav="miner">Miner</a>
|
|
<a href="/app" data-nav="app">App</a>
|
|
<a href="/wallet" data-nav="wallet">Wallet</a>
|
|
<a href="/live" data-nav="live">Live devnet</a>
|
|
<a href="/ledger" data-nav="ledger">Ledger</a>
|
|
<a href="/miner#get" class="btn primary">Download</a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<script>
|
|
(function(){
|
|
// the menu: open on the button, closed by any link, Escape (focus back on the button) or a resize past 900 px
|
|
var n=document.querySelector('.nav'),b=document.getElementById('nav-burger'),s=document.getElementById('nav-sheet');if(!n||!b||!s)return;
|
|
function set(o){n.classList.toggle('open',o);b.setAttribute('aria-expanded',o?'true':'false');b.setAttribute('aria-label',o?'Close the menu':'Open the menu');document.documentElement.style.overflow=o?'hidden':'';}
|
|
b.addEventListener('click',function(){set(!n.classList.contains('open'));});
|
|
s.addEventListener('click',function(e){if(e.target.closest('a'))set(false);});
|
|
document.addEventListener('keydown',function(e){if(e.key==='Escape'&&n.classList.contains('open')){set(false);b.focus();}});
|
|
var mq=window.matchMedia('(min-width:901px)');if(mq.addEventListener)mq.addEventListener('change',function(){set(false);});
|
|
})();
|
|
</script>
|
|
<!-- nav:end -->
|
|
<main id="main" class="wrap">
|
|
<div class="head">
|
|
<div class="eyebrow">Testnet faucet</div>
|
|
<h1>10 IGN a day, for testing.</h1>
|
|
<p>Paste an address. The faucet sends 10 testnet IGN and shows the transaction hash. Once per address per day, once per connection per day. No account, no sign-in.</p>
|
|
<p data-testnet-notice class="notice">Public testnet: not yet open. The faucet is prepared on the devnet and answers "not open yet" until the testnet starts.</p>
|
|
</div>
|
|
<div class="grid">
|
|
<section class="card" aria-labelledby="ask">
|
|
<h2 id="ask">Ask for 10 IGN</h2>
|
|
<p>An Ethereum-style address: 0x and 40 hex characters. The one the miner made for you, or any wallet set to the Igneum testnet.</p>
|
|
<form id="faucet-form" novalidate>
|
|
<label for="address">Address</label>
|
|
<input id="address" name="address" inputmode="text" autocomplete="off" spellcheck="false" placeholder="0x…" required pattern="^0x[0-9a-fA-F]{40}$" aria-describedby="status">
|
|
<button class="btn" id="send" type="submit">Send 10 IGN</button>
|
|
<div class="status" id="status" role="status" aria-live="polite"></div>
|
|
</form>
|
|
</section>
|
|
<aside class="card" aria-labelledby="rules">
|
|
<h2 id="rules">The rules</h2>
|
|
<div class="rules">
|
|
<div class="rule"><span class="num">01</span><div><b>No value</b><span>Testnet IGN cannot be sold, bought or redeemed, now or at mainnet. Mainnet starts from an empty genesis.</span></div></div>
|
|
<div class="rule"><span class="num">02</span><div><b>10 IGN per address per day</b><span>And 10 per connection per day. The limit resets 24 hours after the last grant.</span></div></div>
|
|
<div class="rule"><span class="num">03</span><div><b>Resets</b><span>The chain restarts from a fresh genesis when a consensus rule changes. Balances do not carry over.</span></div></div>
|
|
<div class="rule"><span class="num">04</span><div><b>What is stored</b><span>The address, the connection's IP, the transaction hash and the time, for 24 hours of rate limiting. Nothing else.</span></div></div>
|
|
</div>
|
|
<dl>
|
|
<dt>Chain id</dt><dd>4462 (testnet), 4463 (devnet)</dd>
|
|
<dt>Wallet set-up</dt><dd><a href="/metamask">MetaMask: chain id, RPC, one click</a></dd>
|
|
<dt>Mine instead</dt><dd><a href="/miner#get">Get the miner</a></dd>
|
|
</dl>
|
|
</aside>
|
|
</div>
|
|
</main>
|
|
<!-- footer:start -->
|
|
<footer class="foot">
|
|
<div class="wrap">
|
|
<div class="foot-grid">
|
|
<div class="foot-brand">
|
|
<a href="/" class="brand" aria-label="Igneum home"><svg class="mark" viewBox="0 0 1024 1024" width="26" height="26" aria-hidden="true"><rect width="1024" height="1024" rx="160" fill="#0C0C0E"></rect><g transform="translate(166.95 166.95) scale(6.901)"><polygon points="50,4 74,34 67,58 80,54 61,96 39,96 20,54 33,58 26,34" fill="#F2541B"></polygon><polygon points="50,42 59,58 50,82 41,58" fill="#0C0C0E"></polygon></g></svg><span class="word">IGNEUM</span></a>
|
|
<p>Mined by GPUs. Proven by fire.</p>
|
|
<div class="social" aria-label="Igneum elsewhere">
|
|
<a href="https://github.com/igneum-network/spec" target="_blank" rel="noopener" aria-label="Igneum on GitHub: the spec, the vectors and the issues"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.7.5.5 5.7.5 12c0 5.1 3.3 9.4 7.9 10.9.6.1.8-.3.8-.6v-2.1c-3.2.7-3.9-1.4-3.9-1.4-.5-1.3-1.3-1.7-1.3-1.7-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.7 1.3 3.4 1 .1-.8.4-1.3.7-1.6-2.6-.3-5.3-1.3-5.3-5.7 0-1.3.5-2.3 1.2-3.1-.1-.3-.5-1.5.1-3.1 0 0 1-.3 3.2 1.2.9-.3 1.9-.4 2.9-.4s2 .1 2.9.4c2.2-1.5 3.2-1.2 3.2-1.2.6 1.6.2 2.8.1 3.1.8.8 1.2 1.8 1.2 3.1 0 4.4-2.7 5.4-5.3 5.7.4.4.8 1.1.8 2.2v3.2c0 .3.2.7.8.6 4.6-1.5 7.9-5.8 7.9-10.9C23.5 5.7 18.3.5 12 .5z"></path></svg></a>
|
|
<a href="https://discord.gg/igneum" target="_blank" rel="noopener" aria-label="The Igneum Discord"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M19.6 5.3A17 17 0 0 0 15.4 4l-.2.4a15.6 15.6 0 0 1 3.9 1.9 13.6 13.6 0 0 0-14.2 0A15.6 15.6 0 0 1 8.8 4.4L8.6 4a17 17 0 0 0-4.2 1.3C1.8 9.2 1.1 13 1.4 16.7a17.1 17.1 0 0 0 5.2 2.6l1.1-1.8a10.8 10.8 0 0 1-1.7-.8l.4-.3a12.2 12.2 0 0 0 11.2 0l.4.3-1.7.8 1.1 1.8a17 17 0 0 0 5.2-2.6c.4-4.3-.7-8-3-11.4zM8.7 14.4c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1zm6.6 0c-1 0-1.8-.9-1.8-2.1s.8-2.1 1.8-2.1 1.9 1 1.8 2.1c0 1.2-.8 2.1-1.8 2.1z"></path></svg></a>
|
|
<a data-social="reddit" href="https://www.reddit.com/user/Igneum_network/" target="_blank" rel="noopener" aria-label="Igneum on Reddit"><svg viewBox="0 0 24 24" width="22" height="22" fill="currentColor" aria-hidden="true"><path d="M22 12.1a2.2 2.2 0 0 0-3.7-1.6 10.8 10.8 0 0 0-5.8-1.8l1-4.6 3.2.7a1.5 1.5 0 1 0 .2-.9l-3.6-.8a.5.5 0 0 0-.5.4l-1.1 5.2a10.8 10.8 0 0 0-5.9 1.8A2.2 2.2 0 1 0 3.4 14a4.3 4.3 0 0 0 0 .7c0 3.4 3.9 6.1 8.6 6.1s8.6-2.7 8.6-6.1a4.3 4.3 0 0 0 0-.7 2.2 2.2 0 0 0 1.4-1.9zM7 13.6a1.5 1.5 0 1 1 1.5 1.5A1.5 1.5 0 0 1 7 13.6zm8.6 4.1a5.7 5.7 0 0 1-3.6 1.1 5.7 5.7 0 0 1-3.6-1.1.4.4 0 0 1 .6-.6 4.9 4.9 0 0 0 3 .9 4.9 4.9 0 0 0 3-.9.4.4 0 0 1 .6.6zm-.3-2.6a1.5 1.5 0 1 1 1.5-1.5 1.5 1.5 0 0 1-1.5 1.5z"></path></svg></a>
|
|
</div>
|
|
</div>
|
|
<nav class="foot-col" aria-label="Read">
|
|
<div class="eyebrow">Read</div>
|
|
<a href="/litepaper">Litepaper</a>
|
|
<a href="/litepaper#limits">What Igneum does not claim</a>
|
|
<a href="/litepaper#randomx">Igneum vs RandomX</a>
|
|
<a href="/bench">Engineering log</a>
|
|
<a href="/evidence">Evidence</a>
|
|
<a href="/ledger">Ledger: every criticism</a>
|
|
</nav>
|
|
<nav class="foot-col" aria-label="Run">
|
|
<div class="eyebrow">Run</div>
|
|
<a href="/miner">The miner</a>
|
|
<a href="/app">The app</a>
|
|
<a href="/wallet">The wallet</a>
|
|
<a href="/miners">GPU bench table</a>
|
|
<a href="/miner#fee">The dev fee</a>
|
|
<a href="/faucet">Testnet faucet</a>
|
|
</nav>
|
|
<nav class="foot-col" aria-label="Follow">
|
|
<div class="eyebrow">Follow</div>
|
|
<a href="/live">Live devnet</a>
|
|
<a href="/explorer">Explorer</a>
|
|
<a href="/litepaper#roadmap">Journey</a>
|
|
<a href="/metamask">Add to MetaMask</a>
|
|
<a href="/miner#get">Downloads: devnet build</a>
|
|
</nav>
|
|
<nav class="foot-col" aria-label="Contact">
|
|
<div class="eyebrow">Contact</div>
|
|
<a href="mailto:hello@igneum.network">hello@igneum.network</a>
|
|
<a href="https://github.com/igneum-network/spec/issues" rel="noopener">An issue on the spec</a>
|
|
<span class="foot-note">Report a flaw by either. Nobody from Igneum will ask for your seed.</span>
|
|
</nav>
|
|
</div>
|
|
<div class="foot-base">
|
|
<span class="foot-imprint">Igneum Labs LTD · Unit IH-00-01-01-OF-01, Level 01, Innovation One, Dubai International Financial Centre</span>
|
|
<span class="foot-state"><span class="dot off" id="foot-dot"></span><span id="foot-state">devnet</span></span>
|
|
<span class="theme" role="group" aria-label="Theme"><button type="button" data-theme-set="system" aria-pressed="true">System</button><button type="button" data-theme-set="light" aria-pressed="false">Light</button><button type="button" data-theme-set="dark" aria-pressed="false">Dark</button></span>
|
|
<span class="mono foot-copy">© 2026 Igneum · not an offer to sell anything</span>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
<script>
|
|
(function(){
|
|
// theme control: stores light or dark under igneum-theme; system clears it. The head applied the stored value before paint.
|
|
var bs=document.querySelectorAll('[data-theme-set]');if(!bs.length)return;
|
|
function cur(){try{var t=localStorage.getItem('igneum-theme');return t==='light'||t==='dark'?t:'system';}catch(e){return 'system';}}
|
|
function paint(){var c=cur();bs.forEach(function(b){b.setAttribute('aria-pressed',b.getAttribute('data-theme-set')===c?'true':'false');});}
|
|
bs.forEach(function(b){b.addEventListener('click',function(){var v=b.getAttribute('data-theme-set');try{if(v==='system')localStorage.removeItem('igneum-theme');else localStorage.setItem('igneum-theme',v);}catch(e){}
|
|
if(v==='system')document.documentElement.removeAttribute('data-theme');else document.documentElement.setAttribute('data-theme',v);paint();});});
|
|
paint();
|
|
// the network state word in the footer: one read of the observer per page view
|
|
var fs=document.getElementById('foot-state'),fd=document.getElementById('foot-dot');if(fs&&fd){fetch('/api/live?window=30',{cache:'no-store'}).then(function(r){return r.json();}).then(function(d){var on=d&&d.ok&&d.state&&!d.state.stale;fs.textContent=on?'devnet live':'devnet, observer stale';fd.className='dot '+(on?'live':'off');}).catch(function(){fs.textContent='devnet';});}
|
|
})();
|
|
</script>
|
|
<!-- footer:end -->
|
|
<script>
|
|
(function(){
|
|
var form=document.getElementById('faucet-form'),input=document.getElementById('address'),btn=document.getElementById('send'),out=document.getElementById('status');
|
|
function say(text,state,html){out.setAttribute('data-state',state||'');if(html){out.innerHTML=html;}else{out.textContent=text;}}
|
|
form.addEventListener('submit',function(e){
|
|
e.preventDefault();
|
|
var a=input.value.trim();
|
|
if(!/^0x[0-9a-fA-F]{40}$/.test(a)){say('That is not an address. It is 0x followed by 40 hex characters.','bad');input.focus();return;}
|
|
btn.disabled=true;say('Sending…','');
|
|
fetch('/api/faucet',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({address:a})})
|
|
.then(function(r){return r.json().then(function(j){return {status:r.status,body:j};});})
|
|
.then(function(r){
|
|
if(r.body&&r.body.ok){var h=String(r.body.tx||'');say('',"ok",'Sent 10 IGN. Transaction <code>'+h.replace(/[^0-9a-fx]/gi,'')+'</code>. It is in a block within a few seconds.');}
|
|
else{say((r.body&&r.body.error)||('The faucet answered '+r.status+'.'),'bad');}
|
|
})
|
|
.catch(function(){say('The faucet did not answer. Try again in a minute.','bad');})
|
|
.then(function(){btn.disabled=false;});
|
|
});
|
|
})();
|
|
</script>
|
|
</body>
|
|
</html>
|