Argus � the BNS public gateway (navigate.st) and its library layer. Serves BCNR names over HTTPS, verifies signed records, mints TLDs.
Find a file
Local Dev 9f6dd69bf3 registry covenant v1: the contract that holds a name and enforces its lifecycle (draft)
Expiry was always going to be the chain refusing, not resolvers agreeing. This
is that contract: a certificate sits in a covenant whose address encodes its
owner and expiry, and five paths move it. The owner renews, transfers,
releases or migrates; anyone takes over an expired name at a price that
glides from a premium to a floor, paying the previous owner a share while the
grace period lasts and committing to the name a block ahead.

The two changing values are the last constructor arguments, so they sit first
in the redeem script and the contract re-creates itself by swapping 26 bytes.
A resolver that knows the code can check any claimed owner and expiry against
the address.

Every number comes from registry-lifecycle.js, which was written as the
fixture for this. The tests run each path in libauth's VM under the 2025 and
2026 rules, compare price and split to that model along the glide, and then
break one rule at a time with valid signatures; the suite counts that the VM
itself refused them.

Draft, not reviewed, and not wired into any resolver. REGISTRY-COVENANT-v1.md
says where it departs from the design: script cannot bound a height from
above, so reclaim has no deadline and a commit cannot expire, which leaves
commit hoarding open. That is the first thing a reviewer should read.
2026-10-04 15:42:36 +02:00
contracts registry covenant v1: the contract that holds a name and enforces its lifecycle (draft) 2026-10-04 15:42:36 +02:00
setup Ariadne: keep the resolver running on battery 2026-10-03 13:08:13 +02:00
src registry covenant v1: the contract that holds a name and enforces its lifecycle (draft) 2026-10-04 15:42:36 +02:00
test registry covenant v1: the contract that holds a name and enforces its lifecycle (draft) 2026-10-04 15:42:36 +02:00
.gitignore Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
ariadne.config.json BNS: per-TLD on-chain registry, multi-beacon indexer, enforcement gate 2026-08-29 17:11:02 +02:00
BROWSER-PROMPT.md Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
build-web.mjs Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
DESIGN-collision-modes.md Resolver 3438d558: ASCII-clean install.ps1 + multi-TLD NRPT + VPS-first electrum 2026-07-31 23:09:23 +02:00
DESIGN-hosting-pact.md Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
DESIGN-root-tld-cert.md Collision modes (BCNR/ICANN) + root TLD cert + VPS electrum-source indexer 2026-08-02 11:39:00 +02:00
ENGINE.md Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
LICENSE Licenses: MPL-2.0 for Theseus, Ariadne and Hephaestus; Apache-2.0 for Argus; CC BY 4.0 for the documents 2026-09-29 00:18:00 +02:00
namespaces.pdf Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
OPERATIONS-electrum.md Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
package-lock.json BNS: per-TLD on-chain registry, multi-beacon indexer, enforcement gate 2026-08-29 17:11:02 +02:00
package.json Licenses: MPL-2.0 for Theseus, Ariadne and Hephaestus; Apache-2.0 for Argus; CC BY 4.0 for the documents 2026-09-29 00:18:00 +02:00
PROTOCOL.md bns: the blocklist consumer, shipped with an empty list 2026-10-04 02:32:58 +02:00
README.md Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
ROADMAP.md Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00
sia-test.html Initial commit — Silent Mode baseline (2026-07-29) 2026-07-29 13:54:34 +02:00

BNS — Namecoin-style decentralized names on Bitcoin Cash (chipnet)

A working prototype of "Option 3": names are CashTokens name certificates on the BCH chain (no fork, no sidechain), records ride in OP_RETURN, discovery via a beacon address, and the resolver is embedded in a wallet app with a built-in browser pane — the Brave/MetaMask-browser architecture in miniature.

See PROTOCOL.md for the on-chain design and its honest limitations.

Layout

  • src/lib/bns.js — protocol core: payload codec, chain indexer/resolver, tx builders
  • src/wallet-app.js — wallet + embedded resolver + browser UI (npm run wallet → http://localhost:4626)
  • src/register.js / src/update.js / src/resolve.js — CLI equivalents
  • wallets.json — chipnet seed phrases (TESTNET ONLY — never reuse for real funds)
  • src/lib/gen-wallets.js — one-time wallet generation (already run)

Setup

  1. npm install
  2. Fund the wallet with free chipnet tBCH: go to https://tbch.googol.cash/, paste the wallet address (shown in the app sidebar or by node src/lib/gen-wallets.js), pick chipnet, solve the captcha. ~0.001 tBCH funds hundreds of registrations.
  3. npm run wallet and open http://localhost:4626

Standalone resolver daemon (make EVERY browser resolve .bch)

  • src/daemon/bnsd.js — DNS server (answers *.bch from the chain, forwards everything else upstream) + HTTP gateway that serves on-chain sites by Host header. Test unprivileged: node src/daemon/bnsd.js --dns-port 5354 --http-port 8081, then node src/daemon/dig.js hello.bch.
  • setup/install.ps1 — run from an elevated PowerShell. Installs the daemon as a boot-time scheduled task (SYSTEM, auto-restart) and wires the OS to it:
    • default (-Mode nrpt): adds an NRPT rule so only .bch queries reach the daemon; all other DNS is untouched.
    • -Mode full: points every adapter's DNS at 127.0.0.1 (daemon forwards non-.bch upstream, ncdns-style); original servers are saved and restored on uninstall.
  • setup/uninstall.ps1 — reverses everything (rule/adapters/task).

HTTPS for .bch: the "BNS Local Root CA" (created on demand in ca/, keep root-ca.key private) signs per-name certs. The daemon's :443 gateway mints them on the fly for locally-served names; node src/lib/issue-cert.js <name> issues one for a real server (see the coinspectrum.bch nginx vhost). The installer trusts the root machine-wide and enables Firefox's enterprise-roots policy; cert fingerprints are published in "tls" chain records for pinning.

Caveats: browsers with "secure DNS" (DoH) enabled bypass the OS resolver — disable it or add an exception; ports 53/80/443 must be free.

Try it

  • Register hello with inline HTML (a website stored entirely on-chain), then type hello.bch in the address bar — the app resolves it from the blockchain (not DNS) and renders it.
  • Or CLI: node src/register.js hello '{"h":"<h1>Served from the BCH chain</h1>"}' then node src/resolve.js hello