Status: ready-for-agent # US-049 — Mainnet USDT cutover: two-wallet pilot checklist Priority: High (first real-money friends test) Stage: Operator runbook + config verification ## Goal Move from **Solana devnet + mock-USDT** to **Solana mainnet + real USDT** for a minimal pilot: **one client wallet** (inference payer) and **one node-operator wallet** (payout recipient). Treasury holds USDT and pays SOL fees. TAI stays phase B/C per [ADR-0025](../adr/0025-tai-off-chain-accrual-and-reserved-mint.md). ## Wallet roles | Role | Keypair | On-chain use | |---|---|---| | **Treasury** | Operator `treasury-keypair.json` (multisig when ready) | Holds USDT float + SOL for fees; sends batched node payouts | | **Client** | Your inference-user wallet | SPL USDT → treasury; bound to API key for ledger credit | | **Node** | Your node-operator wallet | Receives USDT payout batches from treasury | The node process already creates/loads a Solana wallet at startup; the client wallet is bound via accounts/dashboard (`POST /v1/wallet/register` or US-041 flows). ## Pre-flight (devnet smoke — do not skip) - [ ] Tracker with `--solana-rpc-url https://api.devnet.solana.com`, mock mint, treasury keypair - [ ] `--settle-period 60 --payout-threshold 0` — confirm payout appears on dashboard **Settlement history** with explorer link - [ ] Run `python -m pytest tests/test_settlement_loop.py -q` — includes prod 24h/5 USDT gate tests - [ ] One inference request → node pending → settlement tx → node wallet balance increases ## Mainnet config change (config-only cutover) Replace devnet values; **no code deploy required** beyond what is already on the branch. ```bash # Example — use your mainnet RPC provider meshnet-tracker start \ --solana-rpc-url https://api.mainnet-beta.solana.com \ --usdt-mint EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v \ --treasury-keypair ~/.config/solana/meshnet-treasury-mainnet.json \ --settle-period 86400 \ --payout-threshold 5.0 \ --payout-dust-floor 0.01 \ --starting-credit 0 \ --devnet-topup 0 ``` | Flag | Devnet (test) | Mainnet (pilot) | |---|---|---| | RPC | `api.devnet.solana.com` | Mainnet RPC (Helius/QuickNode/etc.) | | `--usdt-mint` | mock mint from `devnet_setup.py` | Real USDT mint (`EPjF…` on Solana) | | `--settle-period` | `60` (fast verify) | `86400` (24 h) | | `--payout-threshold` | `0` | `5.0` USDT | | `--starting-credit` | `1.0` (optional) | `0` | | `--devnet-topup` | `1.0` | `0` | ## Treasury funding - [ ] Fund treasury wallet with **SOL** for fees (~0.1–0.5 SOL to start; ~$0.001 per daily batch + ~$0.30 once per new node ATA) - [ ] Fund treasury with **USDT** for node payouts (your float — e.g. first week of expected node earnings) - [ ] Client wallet holds USDT; send a test SPL transfer to treasury ATA; confirm deposit watcher credits API key within one poll interval ## Two-wallet pilot steps 1. **Start tracker** on mainnet config above (single settlement tracker per ADR-0016). 2. **Client path:** register account → create API key → bind **client wallet** → deposit USDT to treasury → verify ledger balance on dashboard. 3. **Node path:** start `meshnet-node` with **node wallet** keypair → register → serve inference. 4. **Inference:** client sends `POST /v1/chat/completions` with API key; verify 402 before deposit, success after. 5. **Accrual:** confirm node **pending USDT** on dashboard rises; client balance debits. 6. **Payout (24 h):** wait for `--settle-period` **or** temporarily lower to `300` for first pilot verification, then restore `86400`. 7. **Threshold path:** alternatively, accumulate ≥ `5` USDT pending in one session to trigger immediate batch without waiting 24 h. 8. **Verify on-chain:** settlement history shows mainnet tx signature; node wallet USDT ATA balance increased; pending zeroed. ## Safety checks - [ ] `--devnet-topup 0` — no faucet on mainnet - [ ] `--starting-credit 0` — no free inference credit - [ ] Treasury keypair not committed to git; file mode 600 - [ ] Plan multisig migration before large float ([alpha runbook](../../.scratch/alpha-hardening/runbooks/02-treasury-key-rotation.md) intent) - [ ] Issue **21** (TOPLOC calibration) before production audit thresholds on untrusted nodes — runbook: [04-toploc-calibration-run](../../.scratch/alpha-hardening/runbooks/04-toploc-calibration-run.md) ## Cost estimate (this pilot) - **SOL fees:** pennies per day at 1 batch × 1 node - **USDT:** whatever clients deposit and nodes earn (treasury is passthrough for payouts) - **TAI mint (optional, ADR-0025 phase B):** ~0.002 SOL one-time — defer if not needed for pilot ## Acceptance criteria - [ ] Devnet checklist completed once - [ ] Mainnet tracker serves dashboard; billing enabled - [ ] Client wallet deposit → ledger credit → inference → debit - [ ] Node wallet receives ≥1 confirmed USDT payout batch on mainnet - [ ] 24 h period enforced: sub-threshold pending not paid before period (covered by `tests/test_settlement_loop.py`) - [ ] ≥5 USDT pending triggers payout without waiting full period (covered by tests) - [ ] Rollback documented: switch RPC + mint back to devnet if needed ## Related - ADR-0015 (USDT custodial settlement) - ADR-0025 (TAI reserved mint / off-chain accrual — not blocking this pilot) - US-033 / US-032 (settlement + deposits) - `scripts/devnet_setup.py` (devnet only)