Skip to Content
svmgovFor StakersCast Vote Override

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 mainnet

Arguments

ArgumentTypeRequiredDescription
--proposal-idStringYesProposal PDA address (base58)
--for-votesu64YesBasis points for For (0–10,000)
--against-votesu64YesBasis points for Against (0–10,000)
--abstain-votesu64YesBasis points for Abstain (0–10,000)
--stake-accountStringYesYour stake account address (base58)
--vote-accountStringYesYour validator’s vote account address (base58)
--networkStringNoNetwork override: mainnet, testnet
--staker-keypairStringYesPath to staker keypair JSON
--close-timestampi64NoUnix timestamp after which the MetaMerkleProof PDA can be closed permissionlessly. Defaults to the proposal’s vote-expiry time

Global Arguments

OptionShortDescription
--rpc-url <URL>-rCustom RPC URL

Requirements

  • for_votes + against_votes + abstain_votes must 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.com

What Happens On-Chain

The CLI fetches from the operator API:

  1. /proof/vote_account/:vote_account — MetaMerkle proof for the validator
  2. /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 Vote PDA immediately
  • If validator hasn’t voted (Path B): Writes to VoteOverrideCache PDA

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.

Last updated on