Cast Vote Override
Override your validator’s governance vote using your stake account.
Description
This command lets a delegator express their own voting preference independently of their validator. The CLI fetches both the MetaMerkle proof (for the validator) and the StakeMerkle proof (for your specific stake account) from the operator API, then submits a vote override transaction to svmgov.
Usage
svmgov cast-vote-override \
--proposal-id "ABC123..." \
--for-votes 6000 \
--against-votes 3000 \
--abstain-votes 1000 \
--stake-account "StAkE..." \
--vote-account "VoTe..." \
--network mainnetArguments
| Argument | Type | Required | Description |
|---|---|---|---|
--proposal-id | String | Yes | Proposal PDA address (base58) |
--for-votes | u64 | Yes | Basis points for For (0–10,000) |
--against-votes | u64 | Yes | Basis points for Against (0–10,000) |
--abstain-votes | u64 | Yes | Basis points for Abstain (0–10,000) |
--stake-account | String | Yes | Your stake account address (base58) |
--vote-account | String | Yes | Your validator’s vote account address (base58) |
--network | String | No | Network override: mainnet, testnet |
--staker-keypair | String | Yes | Path to staker keypair JSON |
--close-timestamp | i64 | No | Unix timestamp after which the MetaMerkleProof PDA can be closed permissionlessly. Defaults to the proposal’s vote-expiry time |
Global Arguments
| Option | Short | Description |
|---|---|---|
--rpc-url <URL> | -r | Custom RPC URL |
Requirements
for_votes + against_votes + abstain_votesmust equal exactly 10,000- Your stake account must be delegated to the specified validator
- Your stake account must be in the NCN snapshot (active at snapshot slot)
- You must be the signing authority (withdraw authority) of the stake account
- Proposal must be in voting phase
Examples
# 60% For, 30% Against, 10% Abstain
svmgov cast-vote-override \
--proposal-id "AbCdEf..." \
--for-votes 6000 \
--against-votes 3000 \
--abstain-votes 1000 \
--stake-account "StAkE111..." \
--vote-account "VoTe111..." \
--network mainnet \
--staker-keypair ~/.config/solana/staker.json
# 100% Against — explicit RPC
svmgov cast-vote-override \
--proposal-id "AbCdEf..." \
--for-votes 0 \
--against-votes 10000 \
--abstain-votes 0 \
--stake-account "StAkE111..." \
--vote-account "VoTe111..." \
--network mainnet \
--staker-keypair ~/.config/solana/staker.json \
--rpc-url https://api.mainnet-beta.solana.comWhat Happens On-Chain
The CLI fetches from the operator API:
/proof/vote_account/:vote_account— MetaMerkle proof for the validator/proof/stake_account/:stake_account— StakeMerkle proof for your stake account
Then calls cast_vote_override which:
- Verifies your stake account is in the snapshot via two-level Merkle proof
- If validator has voted (Path A): Adjusts their
VotePDA immediately - If validator hasn’t voted (Path B): Writes to
VoteOverrideCachePDA
Multiple stake accounts delegated to the same validator can each be overridden independently. Each creates a separate VoteOverride PDA.
If the validator’s MetaMerkleProof PDA does not yet exist, the CLI creates it first and sets its close_timestamp to the proposal’s vote-expiry time (or the --close-timestamp override), so it can be reclaimed permissionlessly once voting ends. You normally don’t need to set this flag.
Related
- Modify Vote Override — Change your override
- For Stakers Overview — How vote overrides work