❄️ Frost Testnet Faucet
Testnet FROST on the Frost L1.
No captcha: your browser mines an ML-DSA-44 keypair
as proof of work. How it works →
Everything the page does is two HTTP calls plus grinding — fully scriptable, no browser needed. Native ML-DSA keygen is much faster than in-browser JS.
1. Get a challenge
GET /api/challenge?address=0xYOURADDRESS
{ "token": "…", "difficulty": 12, "expires_at": …,
"algorithm": "ML-DSA-44",
"rule": "SHA3-256(pk || token) must have 12 leading zero bits" }
2. Grind, sign, claim
Generate ML-DSA-44 keypairs until
SHA3-256(pk || token) has
difficulty leading zero bits (token as ASCII bytes,
pk raw). Sign "frost-faucet-v1" || token || address
(address lowercase hex, ASCII) with the ground secret key, then:
POST /api/claim
{ "address": "0x…", "token": "…", "pk": "<hex>", "sig": "<hex>" }
→ { "tx_hash": "0x…", "amount_wei": "…" }
Reference grinder
The faucet repo ships a multi-core CLI grinder:
git clone <this repo> frost-faucet && cd frost-faucet
uv run grinder.py 0xYOURADDRESS --faucet this-site
Tokens are single-use and expire at expires_at (the
TTL scales with difficulty: at least 5 minutes, 6× the expected
browser-rate grind). Difficulty is priced like a constant-product
pool: it rises as the faucet's 24 h budget depletes (cost per drip
doubles each time the remaining pool halves), plus +1 bit per
successful claim per address (or /24, /56 subnet) in 24 h — repeat
claims never fail, they just cost more.
See how it works,
/llms.txt, and
/api/status.