Stake, delegate, vote
sanect is a fully EVM-compatible Layer 1. All staking actions — delegate, undelegate, redelegate, claim rewards, register validator — are standard EVM transactions signed in MetaMask. They appear in Blockscout like any other EVM tx.
The top 50 validators by stake form the active set, with unlimited registrations — anyone can register, the top 50 form the consensus set, and the rest sit on a waitlist that rotates in by stake rank. Anyone holding SNCT can delegate to any validator and share in their rewards (minus the validator's commission).
The easy way — the staking app
The simplest path: open app.sanect.com (mainnet) or app.testnet.sanect.com (testnet), connect your EVM wallet, and delegate / claim / send from a polished UI. All actions are EVM transactions; no other wallets, no CLI required.
Path A — Direct contract calls (advanced)
Every staking action is a direct call to a precompile at a fixed EVM address. You can call them with ethers, viem, web3.py, Foundry, Hardhat — anything that speaks EVM.
| Precompile | Address | Purpose |
|---|---|---|
| SNCT token (WERC20) | 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE | ERC-20 transfer, balanceOf, approve, transferFrom |
| Staking | 0x0000000000000000000000000000000000000800 | delegate, undelegate, redelegate, createValidator |
| Distribution | 0x0000000000000000000000000000000000000801 | claimRewards, withdrawDelegatorRewards |
| Gov | 0x0000000000000000000000000000000000000805 | vote, deposit |
| Slashing | 0x0000000000000000000000000000000000000806 | unjail |
Example: delegate from ethers.js
import { BrowserProvider, Contract, parseEther } from 'ethers';
const STAKING = '0x0000000000000000000000000000000000000800';
const ABI = [
'function delegate(address delegator, string validatorAddress, uint256 amount) returns (bool)'
];
const provider = new BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const me = await signer.getAddress();
const staking = new Contract(STAKING, ABI, signer);
const tx = await staking.delegate(me, 'snctvaloper1…', parseEther('100'));
await tx.wait();The same approach works for undelegate, redelegate, claimRewards, vote, createValidator — full Solidity interfaces ship in cosmos/evm at /precompiles/<name>/<Name>I.sol.
Path B — sanectd CLI (works without any UI)
You need sanectd installed and a funded key. (See Run a full / RPC node for the binary; you can also just run sanectd against the public RPC without running your own node.)
Delegate
# List active validators (find their snctvaloper... address)
# Mainnet:
sanectd query staking validators --node=https://rpc.sanect.com/rpc
# Testnet:
sanectd query staking validators --node=https://rpc.testnet.sanect.com/rpc
# Delegate 1000 SNCT to a validator (mainnet)
sanectd tx staking delegate <snctvaloper1...> 1000000000000000000000asnct \
--from=mykey \
--node=https://rpc.sanect.com/rpc \
--chain-id=sanect_7628-1 \
--gas-prices=10000000asnct \
--keyring-backend=file \
--yes
1000000000000000000000asnctis1000 × 10^18 asnct = 1000 SNCT. For testnet, use--node=https://rpc.testnet.sanect.com/rpcand--chain-id=sanect_76287-1.
Redelegate (switch validator without unbonding)
sanectd tx staking redelegate <from-valoper> <to-valoper> 500000000000000000000asnct \
--from=mykey --chain-id=sanect_7628-1 \
--gas-prices=10000000asnct --keyring-backend=file --yesClaim rewards
sanectd tx distribution withdraw-rewards <snctvaloper1...> \
--from=mykey --chain-id=sanect_7628-1 \
--gas-prices=10000000asnct --keyring-backend=file --yes
# Or withdraw all rewards from all your delegations:
sanectd tx distribution withdraw-all-rewards \
--from=mykey --chain-id=sanect_7628-1 \
--gas-prices=10000000asnct --keyring-backend=file --yesUnbond
sanectd tx staking unbond <snctvaloper1...> 1000000000000000000000asnct \
--from=mykey --chain-id=sanect_7628-1 \
--gas-prices=10000000asnct --keyring-backend=file --yesTokens become liquid after unbonding_time = 21 days.
Vote on governance
# List active proposals
sanectd query gov proposals --status voting_period \
--node=https://rpc.sanect.com/rpc
# Vote yes / no / abstain / no-with-veto
sanectd tx gov vote <proposal-id> yes \
--from=mykey --chain-id=sanect_7628-1 \
--gas-prices=10000000asnct --keyring-backend=file --yesPath C — query staking state without a wallet
Anyone can read the staking state via the public REST endpoint — no key needed. Useful for dashboards.
# Mainnet
B=https://rpc.sanect.com/rest
# Testnet: B=https://rpc.testnet.sanect.com/rest
# All active validators
curl -s "$B/cosmos/staking/v1beta1/validators?status=BOND_STATUS_BONDED" \
| jq '.validators[] | {moniker:.description.moniker, voting_power:.tokens, commission:.commission.commission_rates.rate}'
# Your delegations
curl -s "$B/cosmos/staking/v1beta1/delegations/<your-cosmos-address>" | jq
# Bonded pool / not_bonded pool totals
curl -s "$B/cosmos/staking/v1beta1/pool" | jq
# Current proposals
curl -s "$B/cosmos/gov/v1/proposals?proposal_status=2" | jqHow DPoS active-set selection works on sanect
max_validators = 50. Only the top 50 by stake sit in the active set at any moment. Validators 51+ are bonded but not signing (no rewards). Registrations are unlimited — anyone can register; the waitlist rotates in by rank.- The active set is recomputed each block — a delegation that pushes one validator past another moves them in/out of the active set immediately.
- BFT consensus needs 2/3 voting power online at any time (34 of 50 if all 50 are equally staked).
See also
- Run a validator — to receive delegations instead of giving them.
- Cosmos REST / RPC reference — every staking and governance endpoint.