Governance is the process of Secret Network users coming to consensus on software upgrades, parameters of the mainnet, or signaling mechanisms through text proposals. This is done through voting on proposals, which will be submitted by SCRT
holders on the mainnet.
Voting is done by bonded SCRT
holders on a 1 bonded SCRT
1 vote basis.
Delegators inherit the vote of their validator if they don't vote.
Votes are tallied at the end of the voting period (1 week on mainnet) where each address can vote multiple times to update its Option
value (paying the transaction fee each time), only the most recently cast vote will count as valid.
Voters can choose between options Yes
, No
, NoWithVeto
and Abstain
.
For more information about the governance process and how it works, please check out the Governance module specification.
To setup governance the secretcli
must be installed. You can get a detailed description of how to install the secretcli here.
In order to create a governance proposal, you must submit an initial deposit along with a title and description. Currently, in order to enter the voting period, a proposal must accumulate within a week deposits of at least .
Note: Please remember through the duration of this guide that the secretcli
counts SCRT in uscrt. 1 SCRT = 1,000,000 uscrt.
Various modules outside of governance may implement their own proposal types and handlers (eg. parameter changes), where the governance module itself supports Text
proposals. Any module outside of governance has it's command mounted on top of submit-proposal
.
Proposals can be submitted using secretcli tx gov submit-proposal
.
Using secretcli tx gov draft-proposal
can help prepare a proposal. The tool will create a file containing the specified proposal message and it also helps with populating all the required proposal fields. You can always edit the file after you create it using draft-proposal
To submit a proposal:
metadata example:
To submit a Text
proposal:
You may also provide the proposal directly through the --proposal
flag which points to a JSON file containing the proposal:
Where proposal.json
is:
Most cosmos-sdk modules allow changing their governance gated parameters using a MsgUpdateParams
which is a new way of updating governance parameters. It is important to note that MsgUpdateParams
requires all parameters to be specified in the proposal message.
We will use draft-proposal
to help us create a proposal file that we will later submit.
After choosing the /cosmos.staking.v1beta1.MsgUpdateParams
message, the applet will allow you to set the message fields and some other proposal details. Upon completion, the proposal will be available in the directory where you called the gaiad
command inside the draft_proposal.json
file.
Here is an example of the draft_proposal.json
file:
Finally, we submit the proposal:
The subspace
is usually the ModuleName
The key
is usually defined in x/$MODULE_NAME/types/params.go
The value
's type is usually near the key
definition
⚠️ subspace
and key
are case sensitive and value
must be of the correct type and within the allowed bounds.
Proposals with errors on these inputs should not enter voting period (should not get deposits) or be voted on with NoWithVeto
.
⚠️ Currently parameter changes are evaluated but not validated, so it is very important that any value
change is valid (i.e. correct type and within bounds) for its respective parameter, eg. MaxValidators
should be an integer and not a decimal.
⚠️ Proper vetting of a parameter change proposal should prevent this from happening (no deposits should occur during the governance process), but it should be noted regardless.
To submit a community pool spend proposal, you also must provide a proposal file as its contents are less friendly to secretcli
input:
We can createproposal.json
using tx gov draft-proposal
To submit a software upgrade
proposal use:
We can createproposal.json
using tx gov draft-proposal
Once created, you can now query information of the proposal:
You can query for all available proposals using:
You can query for the proposal depositor using:
You can query for the proposal depositors using:
You can query for the proposal voter using:
To query for the proposer of a given governance proposal use:
To check the current tally of a given proposal you can use the tally
command:
To check the current governance parameters run:
To query subsets of the governance parameters for voting run:
To query subsets of the governance parameters for tallying run:
To query subsets of the deposit governance parameters for voting run:
You can see another param-change
example here:
distribution.baseproposerreward + distribution.bonusproposerreward < 1
. See and for more info.
To read more go to the .
auth
MaxMemoCharacters
string (uint64)
"256"
auth
TxSigLimit
string (uint64)
"7"
auth
TxSizeCostPerByte
string (uint64)
"10"
auth
SigVerifyCostED25519
string (uint64)
"590"
auth
SigVerifyCostSecp256k1
string (uint64)
"1000"
baseapp
BlockParams
object
{"max_bytes":"10000000","max_gas":"10000000"}
baseapp
EvidenceParams
object
{"max_age_num_blocks":"100000","max_age_duration":"172800000000000","max_bytes":"50000"}
baseapp
ValidatorParams
object
{"pub_key_types":["ed25519"]}
bank
sendenabled
bool
true
crisis
ConstantFee
object (coin)
{"denom": "uscrt", "amount": "1000"}
distribution
communitytax
string (dec)
"0.020000000000000000"
distribution
secretfoundationtax
string (dec)
"0.030000000000000000"
distribution
secretfoundationaddress
string
"secret164z7wwzv84h4hwn6rvjjkns6j4ht43jv8u9k0c"
distribution
baseproposerreward
string (dec)
"0.010000000000000000"
distribution
bonusproposerreward
string (dec)
"0.040000000000000000"
distribution
withdrawaddrenabled
bool
true
evidence
MaxEvidenceAge
string (time ns)
"120000000000"
gov
depositparams
object
{"min_deposit": [{"denom": "uscrt", "amount": "10000000"}], "max_deposit_period": "172800000000000"}
gov
votingparams
object
{"voting_period": "172800000000000"}
gov
tallyparams
object
{"quorum": "0.334000000000000000", "threshold": "0.500000000000000000", "veto": "0.334000000000000000"}
mint
MintDenom
string
"uscrt"
mint
InflationRateChange
string (dec)
"0.080000000000000000"
mint
InflationMax
string (dec)
"0.150000000000000000"
mint
InflationMin
string (dec)
"0.070000000000000000"
mint
GoalBonded
string (dec)
"0.670000000000000000"
mint
BlocksPerYear
string (uint64)
"6311520"
slashing
SignedBlocksWindow
string (int64)
"5000"
slashing
MinSignedPerWindow
string (dec)
"0.500000000000000000"
slashing
DowntimeJailDuration
string (time ns)
"600000000000"
slashing
SlashFractionDoubleSign
string (dec)
"0.050000000000000000"
slashing
SlashFractionDowntime
string (dec)
"0.010000000000000000"
staking
UnbondingTime
string (time ns)
"259200000000000"
staking
MaxValidators
uint16
100
staking
KeyMaxEntries
uint16
7
staking
HistoricalEntries
uint16
3
staking
BondDenom
string
"uscrt"
ibc
AllowedClients
object (string[])
["07-tendermint"]
ibc
MaxExpectedTimePerBlock
uint64
"30000000000"
transfer
SendEnabled
bool
true
transfer
ReceiveEnabled
bool
true
If the proposal you previously created didn't meet the MinDeposit
requirement, you can still increase the total amount deposited to activate it.
Note: Proposals not meeting this requirement will be deleted after MaxDepositPeriod
is reached.
Once the minimum deposit is reached, the proposal enters voting period:
Note: The regular flags for the tx command are applicable to gov deposit
(--fees, --gas, --account-number --ledger, --node, etc...)
The only ways deposits won't be returned to their owners is:
If in the voting period the proposal gets 1/3 NoWithVeto
out of all votes, excluding Abstain votes (So NoWithVeto
needs to be 1/3 out of all Yes
, No
& NoWithVeto
).
If in the voting period less than 1/3 of voting power votes (== The proposal won't reach a quorum).
Anyone can deposit for a proposal, even if you have 0 SCRT
tokens staked/delegated/bonded.
Once a new proposal is created, you can query all the deposits submitted to it:
You can also query a deposit submitted by a specific address:
There are several flags to use with secretcli query gov deposit
: