Run NETWORK=mainnet scripts/localnet.sh to build the mainnet genesis. Below is what the script branches on, what's hard-coded the same for both networks, and what to override.
Was wrong: SDK defaults are 2d voting / 2d deposit / 10⁷ base-unit deposit, not 14d. Mainnet genesis shipped with them. Fixed on chain by MsgUpdateParams (see scripts/mainnet/gov-params-update.md); localnet.sh now sets 14d / 14d / 1d expedited / 10,000 SNCT / 50,000 SNCT for mainnet
explicit mainnet block in localnet.sh
What's the same on both networks (intentional — verify these are still right for mainnet)
Param
Value
Note
Bech32 prefix
snct / snctvaloper / snctvalconspub
Should stay
Base denom
asnct
Should stay
Display denom
snct (1e18 base)
Should stay
BASEFEE / MIN_GAS_PRICE
1 gwei
Recommend bumping mainnet to 5-10 gwei to discourage spam. Easy override: MIN_GAS_PRICE=10000000000.000000000000000000
max_validators
50
Stay
TOTAL_SUPPLY_BASE
1,000,000,000 SNCT
Stay
GENTX_AMOUNT (self-bond)
1000 SNCT
Stay
Block max_gas
150,000,000
Stay
Min self-delegation
100 SNCT
CLAUDE.md says mainnet should be 1000 SNCT (10²¹ asnct). Override: MIN_SELF_DELEGATION_BASE=1000000000000000000000
signed_blocks_window
10,000
Stay
slash_fraction_downtime
0.0001
Stay
slash_fraction_double_sign
0.05
Stay
community_tax
0.02
Stay
inflation_max
0.20 (20%)
Stay (Cosmos Hub curve)
inflation_min
0.07 (7%)
Stay
timeout_commit
400ms
Stay
What needs operator decisions before mainnet genesis
Decision
Default if you don't set
Recommended for mainnet
Single genesis address vs split
Single $VAL_KEY gets full 1B
Use post-genesis GenesisSplit Foundry script to distribute 1B → 3 Safes after genesis is built (testnet pattern)
Initial supply distribution
All to VAL_KEY
Same — split via on-chain script after launch
BASE_FEE
1 gwei
5-10 gwei (override env)
MIN_GAS_PRICE
1 gwei
5-10 gwei (override env)
Validator self-stake at genesis
1000 SNCT (one validator)
Run separate gentx for each launch-day validator BEFORE collect-gentxs
After this builds, you have a genesis.json at /tmp/sanect-mainnet-genesis/config/genesis.json ready to ship with the Docker image.
What the script does NOT do for mainnet (manual steps)
Doesn't run GenesisSplit.s.sol — do that on-chain at block N after launch.
Doesn't include extra validators' gentx — those go through sanectd genesis add-genesis-account + gentx for each separately, OR via the new validator script.
Doesn't bake any pre-deployed contracts. Privacy / DEX / Domain / Bridge contracts deploy via Foundry scripts post-genesis.
Part 2 — Per-service env-var diff (testnet → mainnet)
Each Railway service needs its env updated. Below is the COMPLETE delta per service.