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
| Type | Description | Use Case |
|---|---|---|
| Text | A signaling proposal with no automatic on-chain execution | Community sentiment, non-binding resolutions, RFC-style discussions |
| Parameter Change | Modifies one or more on-chain module parameters | Adjusting gas prices, staking parameters, slashing thresholds |
| Software Upgrade | Schedules a coordinated binary upgrade at a specified block height | Chain upgrades, new module deployments |
| Community Pool Spend | Transfers funds from the community pool to a recipient address | Grants, 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.
| Parameter | Value |
|---|---|
| Minimum Deposit | 10 GHOST (10,000,000,000,000,000,000 aghost) |
| Deposit Period | 48 hours |
| Deposit Refund | Deposits are refunded if the proposal is not vetoed |
| Deposit Burn | Deposits 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
| Option | Effect |
|---|---|
| Yes | Support the proposal |
| No | Oppose the proposal |
| Abstain | Decline to vote for/against, but count toward quorum |
| NoWithVeto | Oppose 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:
| Criterion | Threshold | What Happens if Not Met |
|---|---|---|
| Quorum | 33.4% of staked GHOST must vote | Proposal fails, deposits are burned |
| Threshold | >50% of non-abstain votes must be Yes | Proposal fails, deposits are refunded |
| Veto | Under 33.4% of total votes must be NoWithVeto | Proposal fails, deposits are burned |
The tallying logic (in order):
- Check quorum: If fewer than 33.4% of all staked tokens voted (including Abstain), the proposal fails and deposits are burned.
- Check veto: If more than 33.4% of total votes are NoWithVeto, the proposal fails and deposits are burned.
- 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
| Parameter | Value | Module |
|---|---|---|
min_deposit | 10 GHOST | x/gov |
max_deposit_period | 48 hours | x/gov |
voting_period | 48 hours | x/gov |
quorum | 0.334 (33.4%) | x/gov |
threshold | 0.500 (50%) | x/gov |
veto_threshold | 0.334 (33.4%) | x/gov |
burn_vote_quorum | true | x/gov |
burn_vote_veto | true | x/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
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
- Discuss first. Before submitting an on-chain proposal, discuss it in the Specter governance forum or Discord. Gather feedback and refine the proposal text.
- 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.
- Provide context. Link to relevant discussions, research, audits, or technical documentation.
- Start with a text proposal. For contentious changes, submit a non-binding text proposal first to gauge community sentiment before submitting the binding version.
- Fund the deposit yourself (if possible) to demonstrate conviction in the proposal.
For Validators
- 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.
- Communicate your rationale. Publish your voting rationale to delegators before the voting period ends so they can override if they disagree.
- Monitor the deposit period. Deposit on proposals you believe deserve a vote, even if you plan to vote No.
For Delegators
- Check active proposals regularly. Use
umbralined query gov proposals --status voting_periodto see what is up for vote. - Vote directly when you have a strong opinion. Your vote overrides your validator's vote.
- 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.