Governance

Governance is the process from which users in the Secret Blockchain can come 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.

Some considerations about the voting process:

  • 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.
  • At the end of the voting period, a proposal is accepted IFF:
    • (YesVotes / (YesVotes+NoVotes+NoWithVetoVotes)) > 1/2 (threshold )
    • (NoWithVetoVotes / (YesVotes+NoVotes+NoWithVetoVotes)) < 1/3 (veto )
    • ((YesVotes+NoVotes+NoWithVetoVotes) / totalBondedStake) > 1/3 (quorum )

For more information about the governance process and how it works, please check out the Governance module specification .

Setup


Create a Governance Proposal


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 1000 SCRT .

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.

Text

To submit a Text proposal:

secretcli tx gov submit-proposal \
  --title <title> \
  --description <description> \
  --type Text \
  --deposit 1000000uscrt \
  --from <key_alias>

You may also provide the proposal directly through the --proposal flag which points to a JSON file containing the proposal:

secretcli tx gov submit-proposal --proposal <path/to/proposal.json> --from <key_alias>

Where proposal.json is:

{
  "type": "Text",
  "title": "My Cool Proposal",
  "description": "A description with line breaks \n and `code formatting`",
  "deposit": "1000000uscrt"
}

Param Change

To submit a parameter change proposal, you must provide a proposal file as its contents are less friendly to CLI input:

secretcli tx gov submit-proposal param-change <path/to/proposal.json> --from <key_alias>

Where proposal.json is:

{
  "title": "Param Change",
  "description": "Update max validators with line breaks \n and `code formatting`",
  "changes": [
    {
      "subspace": "Staking",
      "key": "MaxValidators",
      "value": 105
    }
  ],
  "deposit": [
    {
      "denom": "uscrt",
      "amount": "10000000"
    }
  ]
}

You can see another param-change example here: enigma-1-proposal-3.json

Subspaces, Keys and Values

SubspaceKeyTypeExample
authMaxMemoCharactersstring (uint64)"256"
authTxSigLimitstring (uint64)"7"
authTxSizeCostPerBytestring (uint64)"10"
authSigVerifyCostED25519string (uint64)"590"
authSigVerifyCostSecp256k1string (uint64)"1000"
banksendenabledbooltrue
crisisConstantFeeobject (coin){"denom": "uscrt", "amount": "1000"}
distributioncommunitytaxstring (dec)"0.020000000000000000"
distributionsecretfoundationtaxstring (dec)"0.030000000000000000"
distributionsecretfoundationaddressstring"secret164z7wwzv84h4hwn6rvjjkns6j4ht43jv8u9k0c"
distributionbaseproposerrewardstring (dec)"0.010000000000000000"
distributionbonusproposerrewardstring (dec)"0.040000000000000000"
distributionwithdrawaddrenabledbooltrue
evidenceMaxEvidenceAgestring (time ns)"120000000000"
govdepositparamsobject{"min_deposit": [{"denom": "uscrt", "amount": "10000000"}], "max_deposit_period": "172800000000000"}
govvotingparamsobject{"voting_period": "172800000000000"}
govtallyparamsobject{"quorum": "0.334000000000000000", "threshold": "0.500000000000000000", "veto": "0.334000000000000000"}
mintMintDenomstring"uscrt"
mintInflationRateChangestring (dec)"0.080000000000000000"
mintInflationMaxstring (dec)"0.150000000000000000"
mintInflationMinstring (dec)"0.070000000000000000"
mintGoalBondedstring (dec)"0.670000000000000000"
mintBlocksPerYearstring (uint64)"6311520"
slashingSignedBlocksWindowstring (int64)"5000"
slashingMinSignedPerWindowstring (dec)"0.500000000000000000"
slashingDowntimeJailDurationstring (time ns)"600000000000"
slashingSlashFractionDoubleSignstring (dec)"0.050000000000000000"
slashingSlashFractionDowntimestring (dec)"0.010000000000000000"
stakingUnbondingTimestring (time ns)"259200000000000"
stakingMaxValidatorsuint16100
stakingKeyMaxEntriesuint167
stakingHistoricalEntriesuint163
stakingBondDenomstring"uscrt"

Please note:

Known Constraints
  • distribution.baseproposerreward + distribution.bonusproposerreward < 1. See this and this for more info.

To read more go to https://github.com/gavinly/CosmosParametersWiki.

Community Pool Spend

To submit a community pool spend proposal, you also must provide a proposal file as its contents are less friendly to CLI input:

secretcli tx gov submit-proposal community-pool-spend <path/to/proposal.json> --from <key_alias>

Where proposal.json is:

{
  "title": "Community Pool Spend",
  "description": "Spend 10 SCRT with line breaks \n and `code formatting`",
  "recipient": "secret1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "amount": [
    {
      "denom": "uscrt",
      "amount": "10000000"
    }
  ],
  "deposit": [
    {
      "denom": "uscrt",
      "amount": "10000000"
    }
  ]
}

Software Upgrade

The SoftwareUpgrade is currently not supported as it's not implemented and currently does not differ from the semantics of a Text proposal.

Query Proposals


Once created, you can now query information of the proposal:

secretcli query gov proposal <proposal_id>

Or query all available proposals:

secretcli query gov proposals

You can also query proposals filtered by voter or depositor by using the corresponding flags.

To query for the proposer of a given governance proposal:

secretcli query gov proposer <proposal_id>

Increase Deposit


If the proposal you previously created didn't meet the MinDeposit requirement, you can still increase the total amount deposited to activate it. Once the minimum deposit is reached, the proposal enters voting period:

secretcli tx gov deposit <proposal_id> "10000000uscrt" --from <key_alias>

NOTE: Proposals that don't meet this requirement will be deleted after MaxDepositPeriod is reached.

The only ways deposits won't be returned to their owners is:

  1. 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 ).
  2. 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.

Query Deposits


Once a new proposal is created, you can query all the deposits submitted to it:

secretcli query gov deposits <proposal_id>

You can also query a deposit submitted by a specific address:

secretcli query gov deposit <proposal_id> <depositor_address>

Vote on a Proposal


After a proposal's deposit reaches the MinDeposit value, the voting period opens. Bonded SCRT holders can then cast vote on it:

secretcli tx gov vote <proposal_id> <Yes/No/NoWithVeto/Abstain> --from <key_alias>

Query Votes


Check the vote with the option you just submitted:

secretcli query gov vote <proposal_id> <voter_address>

You can also get all the previous votes submitted to the proposal with:

secretcli query gov votes <proposal_id>

Query proposal tally results


To check the current tally of a given proposal you can use the tally command:

secretcli query gov tally <proposal_id>

Query Governance Parameters


To check the current governance parameters run:

secretcli query gov params

To query subsets of the governance parameters run:

secretcli query gov param voting
secretcli query gov param tallying
secretcli query gov param deposit