Keelchain
Docs / The public testnet

The public testnet

Live since 2026-09-24 at keelchain.com, deployed only by GitHub Actions (infra/testnet/README.md).

Piece Where
site https://keelchain.com (site/, wallet pages, wallet packages under /wallet/downloads/)
explorer https://testnet.keelchain.com (apps/explorer, VITE_BASE=/)
read API https://testnet.keelchain.com/api/v1/… (keel-indexer, docs/explorer-api.md)
node RPC https://testnet.keelchain.com/rpc/v1/… (keel-node; status, accounts, params, gov/roles, gov/proposals, receipts, WebSocket at /rpc/v1/ws)
chain id 3, _KEEL_CHAIN namespace, external network signet; the validator set is the host set in DEPLOY_HOSTS (one host today; consensus is BFT, so four validators tolerate one fault and three tolerate none), 600-block epochs; genesis built by the deploy workflow from every host's public identity plus infra/testnet/genesis-params.json (voting 60 blocks, timelock 10, proposal deposit 1000 KEEL)
vaults BTC (signet, pruned bitcoind on host 0, shared with the other hosts over WireGuard) and TRON (Nile); one observer per host, quorum two thirds, the vault key held as CGGMP21 threshold shares created by the TSS ceremony workflow (development signer only in single-host local mode). Every signer checks each request against the chain's outbound rows before signing. Bitcoin checkpoints go through governance: host 0 proposes daily, every host votes on proposals whose header matches its Bitcoin view
assets KEEL (6), KUSD (6), BTC.BTC, ETH.ETH, ETH.USDT, TRON.TRX, TRON.USDT
wallet Keel Wallet 1.2.0, window.keel

The node and the indexer send open CORS headers, so browser clients can call the testnet directly.

Funding an account

See docs/deposits.md: request a deposit address (wallet Receive, CLI or SDK), send signet BTC or Nile USDT/TRX to it, and the chain credits the vault asset after that chain's confirmations.

Clients

A client is any service that signs actions for its users or holds a role. Run the Onboard client workflow with the client's account address: it adds the account to the attester set (and, if asked, makes it the param admin) and sends it starting KEEL and KUSD. The first client is a marketplace sandbox that signs up users with Keel Wallet and settles trades on the chain.

Running a follower

Anyone can run a node that verifies the chain and serves the RPC without voting. Fetch the genesis file (/v1/sync/meta names the snapshot height; the genesis is published with each reset), then:

keel-node --me <seed-or-key>@<port> --genesis genesis.json --role follower \
  --bootstrappers <validator-pubkey>@<ip:port> --advertise <your-ip:port> \
  --sync-from https://testnet.keelchain.com/rpc \
  --storage-dir /var/lib/keel --rpc-listen 127.0.0.1

--sync-from installs the newest snapshot (checked against the full-state hash and the tip hash the peer reports; add --sync-verify <another rpc> to have a second node confirm the tip) and the epoch boundaries, then the node fetches the blocks above it from its peers. A follower holds no block below its snapshot, and --retain-blocks N lets it drop journal segments older than N blocks below each new snapshot; /v1/status reports oldest_block and /v1/blocks serves what it has. Validators keep the full history. Validators keep followers connected through --extra-peers or, once the follower bonds, through the chain state itself.

Faucet

faucet.keelchain.com sends 100 KEEL and 100 KUSD to any account address, once per address a day and a few times per network address. It is an ordinary account funded from genesis; its sends are plain transfers on the explorer. Scripted: POST https://testnet.keelchain.com/api/v1/faucet with {"address": "<64 hex>"}; GET /v1/faucet for the amounts and what it holds, GET /v1/faucet/claims for history. Clients' operator accounts are funded through onboarding, not the faucet.

Operations

Every host backs itself up daily (snapshot, config, and the indexer database on host 0; encrypted, copied off the box), writes health metrics for node_exporter every minute, and votes on pre-approved governance proposals every ten minutes. Host 0 can run Prometheus, Alertmanager and Grafana. Binary upgrades go through a SoftwareUpgrade proposal: a node stops at an activation height it was not voted in for, so the matching release is deployed first. infra/testnet/README.md has the details; CHANGELOG.md announces resets and upgrades.

Resetting

Run Deploy testnet with reset_chain checked. State, the indexer database and the vault registrations are rebuilt from the seeds in the GitHub environment. Balances and roles granted by onboarding are gone; run the onboarding again for each client.

Local

infra/dev/devnet.sh starts a four-validator devnet on one machine; infra/dev/e2e.sh runs the trading and governance flows against it; infra/dev/custody-e2e.sh exercises deposits and payouts with regtest Bitcoin and a Tron mock. See chain/README.md for the flags.