Skip to main content

Governance

Specter uses the Cosmos SDK x/gov module for on-chain governance. Any GHOST token holder can submit proposals, deposit tokens to bring proposals to a vote, and vote on active proposals. Validators vote on behalf of their delegators by default, but delegators can override their validator's vote at any time.

Proposal Types

TypeDescriptionUse Case
TextA signaling proposal with no automatic on-chain executionCommunity sentiment, non-binding resolutions, RFC-style discussions
Parameter ChangeModifies one or more on-chain module parametersAdjusting gas prices, staking parameters, slashing thresholds
Software UpgradeSchedules a coordinated binary upgrade at a specified block heightChain upgrades, new module deployments
Community Pool SpendTransfers funds from the community pool to a recipient addressGrants, ecosystem funding, bounties

Proposal Lifecycle

Every proposal goes through the following stages:

Submit Proposal → Deposit Period → Voting Period → Tallying → Execution
(48 hours) (48 hours)

1. Submit Proposal

Any account can submit a proposal by paying a transaction fee. The proposal enters the deposit period immediately.

# Submit a text proposal
umbralined tx gov submit-proposal \
--type text \
--title "Proposal Title" \
--description "Detailed description of the proposal and its rationale." \
--deposit 5000000000000000000aghost \
--from my-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost

2. Deposit Period (48 Hours)

After submission, the proposal must accumulate the minimum deposit before the voting period begins. If the minimum deposit is not reached within the deposit period, the proposal is removed and all deposits are burned.

ParameterValue
Minimum Deposit10 GHOST (10,000,000,000,000,000,000 aghost)
Deposit Period48 hours
Deposit RefundDeposits are refunded if the proposal is not vetoed
Deposit BurnDeposits are burned if the proposal is vetoed (>33.4% NoWithVeto) or fails to reach minimum deposit
# Deposit additional tokens to an existing proposal
umbralined tx gov deposit <proposal-id> 5000000000000000000aghost \
--from my-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost

Multiple accounts can contribute to the deposit. Once the total reaches 10 GHOST, the proposal immediately enters the voting period.

3. Voting Period (48 Hours)

During the voting period, all staked GHOST holders (validators and their delegators) can cast a vote.

Vote Options

OptionEffect
YesSupport the proposal
NoOppose the proposal
AbstainDecline to vote for/against, but count toward quorum
NoWithVetoOppose the proposal and signal it is harmful/spam. If >33.4% of votes are NoWithVeto, deposits are burned
# Cast a vote
umbralined tx gov vote <proposal-id> yes \
--from my-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost

Valid vote options: yes, no, abstain, no_with_veto.

4. Tallying

At the end of the voting period, votes are tallied according to these rules:

CriterionThresholdWhat Happens if Not Met
Quorum33.4% of staked GHOST must voteProposal fails, deposits are burned
Threshold>50% of non-abstain votes must be YesProposal fails, deposits are refunded
VetoUnder 33.4% of total votes must be NoWithVetoProposal fails, deposits are burned

The tallying logic (in order):

  1. Check quorum: If fewer than 33.4% of all staked tokens voted (including Abstain), the proposal fails and deposits are burned.
  2. Check veto: If more than 33.4% of total votes are NoWithVeto, the proposal fails and deposits are burned.
  3. Check threshold: Among non-abstain votes, if more than 50% are Yes, the proposal passes. Otherwise it fails and deposits are refunded.

5. Execution

  • Text proposals: No automatic execution. They serve as a recorded signal of community intent.
  • Parameter change proposals: The parameter change is applied immediately at the end of the voting period.
  • Software upgrade proposals: The upgrade is scheduled for the specified block height. Validators must upgrade their binary before that height.
  • Community pool spend proposals: Funds are transferred from the community pool to the specified recipient immediately.

Governance Parameters

ParameterValueModule
min_deposit10 GHOSTx/gov
max_deposit_period48 hoursx/gov
voting_period48 hoursx/gov
quorum0.334 (33.4%)x/gov
threshold0.500 (50%)x/gov
veto_threshold0.334 (33.4%)x/gov
burn_vote_quorumtruex/gov
burn_vote_vetotruex/gov

These parameters are themselves governable — they can be changed through a parameter change proposal.

Query Current Parameters

# View all governance parameters
umbralined query gov params

# View deposit parameters
umbralined query gov params --subspace deposit

# View voting parameters
umbralined query gov params --subspace voting

# View tallying parameters
umbralined query gov params --subspace tallying

Delegator Voting

Delegators inherit their validator's vote by default. However, delegators can cast their own vote to override this default at any time during the voting period.

How vote weight works:

  • A delegator's vote weight equals the amount of GHOST they have staked.
  • If a delegator votes, their vote overrides the validator's vote for their staked amount.
  • If a delegator does not vote, their staked tokens are counted according to their validator's vote.
  • If a delegator's tokens are split across multiple validators, and only some validators vote, only the portions with voting validators are counted.
# As a delegator, override your validator's vote
umbralined tx gov vote <proposal-id> no \
--from my-delegator-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost
tip

Delegators are encouraged to vote directly on all proposals. This is your mechanism for participating in the governance of the Specter network, and it ensures your voice is heard even if your validator votes differently than you prefer.

Submitting Specific Proposal Types

Parameter Change Proposal

umbralined tx gov submit-proposal param-change proposal.json \
--from my-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost

Where proposal.json contains:

{
"title": "Increase Minimum Gas Price",
"description": "This proposal increases the recommended minimum gas price from 0.001aghost to 0.01aghost to better protect against spam transactions during periods of high network load.",
"changes": [
{
"subspace": "evm",
"key": "MinGasPrice",
"value": "\"0.01\""
}
],
"deposit": "10000000000000000000aghost"
}

Software Upgrade Proposal

umbralined tx gov submit-proposal software-upgrade v2.0.0 \
--title "Upgrade to v2.0.0" \
--description "This upgrade introduces improved EVM gas metering and a new x/ghostmint audit trail feature." \
--upgrade-height 500000 \
--upgrade-info '{"binaries":{"linux/amd64":"https://github.com/specter-chain/umbraline-cosmos/releases/download/v2.0.0/umbralined-v2.0.0-linux-amd64"}}' \
--deposit 10000000000000000000aghost \
--from my-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost

Community Pool Spend Proposal

umbralined tx gov submit-proposal community-pool-spend proposal.json \
--from my-key \
--chain-id umbraline_5446-1 \
--gas auto \
--gas-prices 0.001aghost

Where proposal.json contains:

{
"title": "Fund Privacy Research Grant",
"description": "Allocate 50,000 GHOST from the community pool to fund ZK circuit optimization research by the Specter Labs team.",
"recipient": "umbra1recipient...",
"amount": "50000000000000000000000aghost",
"deposit": "10000000000000000000aghost"
}

Querying Proposals

# List all proposals
umbralined query gov proposals

# View a specific proposal
umbralined query gov proposal <proposal-id>

# View the deposit status of a proposal
umbralined query gov deposits <proposal-id>

# View all votes on a proposal
umbralined query gov votes <proposal-id>

# View the current tally of a proposal
umbralined query gov tally <proposal-id>

# View your vote on a proposal
umbralined query gov vote <proposal-id> $(umbralined keys show my-key -a)

Best Practices

For Proposal Authors

  1. Discuss first. Before submitting an on-chain proposal, discuss it in the Specter governance forum or Discord. Gather feedback and refine the proposal text.
  2. Be specific. Clearly state what the proposal does, why it is needed, and what the expected impact is. For parameter changes, include before/after values.
  3. Provide context. Link to relevant discussions, research, audits, or technical documentation.
  4. Start with a text proposal. For contentious changes, submit a non-binding text proposal first to gauge community sentiment before submitting the binding version.
  5. Fund the deposit yourself (if possible) to demonstrate conviction in the proposal.

For Validators

  1. Vote on every proposal. Your delegators trust you to represent their interests. If you abstain or do not vote, their tokens may not be counted.
  2. Communicate your rationale. Publish your voting rationale to delegators before the voting period ends so they can override if they disagree.
  3. Monitor the deposit period. Deposit on proposals you believe deserve a vote, even if you plan to vote No.

For Delegators

  1. Check active proposals regularly. Use umbralined query gov proposals --status voting_period to see what is up for vote.
  2. Vote directly when you have a strong opinion. Your vote overrides your validator's vote.
  3. Use NoWithVeto carefully. This option is reserved for proposals that are spam or fundamentally harmful. If the veto threshold is reached, the proposer's deposit is burned.