# US-040 — Devnet top-up button on the dashboard Status: planned Priority: High (friends-test convenience — refill without on-chain deposits) Stage: Designed ## Context Once Caller Credit (US-039) is spent, the only refill path is a real USDT deposit through the treasury watcher — devnet Solana plumbing friends won't have. For test deployments the dashboard needs a "add $10" style button. This is a faucet: 0 disables it, and mainnet deployments must set 0. ## Design 1. **`--devnet-topup N`** (USDT per click) on `meshnet-tracker start`; stack variable `DEVNET_TOPUP`. Default is the single constant `DEFAULT_DEVNET_TOPUP_USDT = 1.0` in `server.py` (devnet-friendly alpha, revised 2026-07-06 — the alpha's public trackers are devnet-only). 2. **`POST /v1/account/topup`** — session-authenticated (same as key management). Body: `{"api_key": "sk-mesh-..."}`. Rules: - 404 when the feature is disabled (flag absent/0) - key must belong to the logged-in account (403 otherwise) - credits exactly the configured amount (client cannot choose it), note `devnet-topup`; returns the new balance 3. **Dashboard**: `/v1/account` response gains `topup_amount` (0 when disabled); when positive, each key row renders a `+$N (devnet)` button calling the endpoint. 4. **Abuse bound**: per-click amount is operator-set and requires a registered session; acceptable for a friends-test faucet. Mainnet deployments simply never set the flag. (Rate limiting is deliberately out of scope.) ## Acceptance criteria - Flag off: endpoint 404s, dashboard shows no top-up button - Flag on: logged-in user tops up own key, balance rises by exactly N - Topping up another account's key → 403 - `python -m pytest` passes from repo root