2019-06-05 16:26:17 -07:00
package types
2018-06-21 17:19:14 -07:00
import (
2019-01-22 09:28:39 -08:00
"fmt"
2018-09-20 07:53:52 -07:00
"time"
2018-06-21 17:19:14 -07:00
sdk "github.com/cosmos/cosmos-sdk/types"
2020-02-19 03:52:20 -08:00
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
2018-06-21 17:19:14 -07:00
)
2019-08-08 12:51:18 -07:00
// Default period for deposits & voting
const (
DefaultPeriod time . Duration = time . Hour * 24 * 2 // 2 days
)
// Default governance params
var (
DefaultMinDepositTokens = sdk . TokensFromConsensusPower ( 10 )
DefaultQuorum = sdk . NewDecWithPrec ( 334 , 3 )
DefaultThreshold = sdk . NewDecWithPrec ( 5 , 1 )
DefaultVeto = sdk . NewDecWithPrec ( 334 , 3 )
)
2019-05-27 17:47:12 -07:00
// Parameter store key
var (
ParamStoreKeyDepositParams = [ ] byte ( "depositparams" )
ParamStoreKeyVotingParams = [ ] byte ( "votingparams" )
ParamStoreKeyTallyParams = [ ] byte ( "tallyparams" )
)
2019-08-08 12:51:18 -07:00
// ParamKeyTable - Key declaration for parameters
2020-02-19 03:52:20 -08:00
func ParamKeyTable ( ) paramtypes . KeyTable {
return paramtypes . NewKeyTable (
paramtypes . NewParamSetPair ( ParamStoreKeyDepositParams , DepositParams { } , validateDepositParams ) ,
paramtypes . NewParamSetPair ( ParamStoreKeyVotingParams , VotingParams { } , validateVotingParams ) ,
paramtypes . NewParamSetPair ( ParamStoreKeyTallyParams , TallyParams { } , validateTallyParams ) ,
2019-05-27 17:47:12 -07:00
)
}
2019-08-08 12:51:18 -07:00
// DepositParams defines the params around deposits for governance
2018-11-06 23:33:18 -08:00
type DepositParams struct {
2019-07-05 16:25:56 -07:00
MinDeposit sdk . Coins ` json:"min_deposit,omitempty" yaml:"min_deposit,omitempty" ` // Minimum deposit for a proposal to enter voting period.
MaxDepositPeriod time . Duration ` json:"max_deposit_period,omitempty" yaml:"max_deposit_period,omitempty" ` // Maximum period for Atom holders to deposit on a proposal. Initial value: 2 months
2018-06-21 17:19:14 -07:00
}
2019-05-16 08:25:32 -07:00
// NewDepositParams creates a new DepositParams object
func NewDepositParams ( minDeposit sdk . Coins , maxDepositPeriod time . Duration ) DepositParams {
return DepositParams {
MinDeposit : minDeposit ,
MaxDepositPeriod : maxDepositPeriod ,
}
}
2019-08-08 12:51:18 -07:00
// DefaultDepositParams default parameters for deposits
func DefaultDepositParams ( ) DepositParams {
return NewDepositParams (
sdk . NewCoins ( sdk . NewCoin ( sdk . DefaultBondDenom , DefaultMinDepositTokens ) ) ,
DefaultPeriod ,
)
}
// String implements stringer insterface
2019-01-22 09:28:39 -08:00
func ( dp DepositParams ) String ( ) string {
return fmt . Sprintf ( ` Deposit Params :
Min Deposit : % s
Max Deposit Period : % s ` , dp . MinDeposit , dp . MaxDepositPeriod )
}
2019-08-08 12:51:18 -07:00
// Equal checks equality of DepositParams
2019-01-07 14:24:04 -08:00
func ( dp DepositParams ) Equal ( dp2 DepositParams ) bool {
return dp . MinDeposit . IsEqual ( dp2 . MinDeposit ) && dp . MaxDepositPeriod == dp2 . MaxDepositPeriod
}
2019-12-10 08:48:57 -08:00
func validateDepositParams ( i interface { } ) error {
v , ok := i . ( DepositParams )
if ! ok {
return fmt . Errorf ( "invalid parameter type: %T" , i )
}
if ! v . MinDeposit . IsValid ( ) {
return fmt . Errorf ( "invalid minimum deposit: %s" , v . MinDeposit )
}
if v . MaxDepositPeriod <= 0 {
return fmt . Errorf ( "maximum deposit period must be positive: %d" , v . MaxDepositPeriod )
}
return nil
}
2019-08-08 12:51:18 -07:00
// TallyParams defines the params around Tallying votes in governance
2018-11-06 23:33:18 -08:00
type TallyParams struct {
2019-07-05 16:25:56 -07:00
Quorum sdk . Dec ` json:"quorum,omitempty" yaml:"quorum,omitempty" ` // Minimum percentage of total stake needed to vote for a result to be considered valid
Threshold sdk . Dec ` json:"threshold,omitempty" yaml:"threshold,omitempty" ` // Minimum proportion of Yes votes for proposal to pass. Initial value: 0.5
Veto sdk . Dec ` json:"veto,omitempty" yaml:"veto,omitempty" ` // Minimum value of Veto votes to Total votes ratio for proposal to be vetoed. Initial value: 1/3
2018-06-21 17:19:14 -07:00
}
2019-05-16 08:25:32 -07:00
// NewTallyParams creates a new TallyParams object
func NewTallyParams ( quorum , threshold , veto sdk . Dec ) TallyParams {
return TallyParams {
Quorum : quorum ,
Threshold : threshold ,
Veto : veto ,
}
}
2019-08-08 12:51:18 -07:00
// DefaultTallyParams default parameters for tallying
func DefaultTallyParams ( ) TallyParams {
return NewTallyParams ( DefaultQuorum , DefaultThreshold , DefaultVeto )
}
// String implements stringer insterface
2019-01-22 09:28:39 -08:00
func ( tp TallyParams ) String ( ) string {
return fmt . Sprintf ( ` Tally Params :
Quorum : % s
Threshold : % s
2019-02-27 08:44:05 -08:00
Veto : % s ` ,
tp . Quorum , tp . Threshold , tp . Veto )
2019-01-22 09:28:39 -08:00
}
2019-12-10 08:48:57 -08:00
func validateTallyParams ( i interface { } ) error {
v , ok := i . ( TallyParams )
if ! ok {
return fmt . Errorf ( "invalid parameter type: %T" , i )
}
if v . Quorum . IsNegative ( ) {
return fmt . Errorf ( "quorom cannot be negative: %s" , v . Quorum )
}
if v . Quorum . GT ( sdk . OneDec ( ) ) {
return fmt . Errorf ( "quorom too large: %s" , v )
}
if ! v . Threshold . IsPositive ( ) {
return fmt . Errorf ( "vote threshold must be positive: %s" , v . Threshold )
}
if v . Threshold . GT ( sdk . OneDec ( ) ) {
return fmt . Errorf ( "vote threshold too large: %s" , v )
}
if ! v . Veto . IsPositive ( ) {
return fmt . Errorf ( "veto threshold must be positive: %s" , v . Threshold )
}
if v . Veto . GT ( sdk . OneDec ( ) ) {
return fmt . Errorf ( "veto threshold too large: %s" , v )
}
return nil
}
2019-08-08 12:51:18 -07:00
// VotingParams defines the params around Voting in governance
2018-11-06 23:33:18 -08:00
type VotingParams struct {
2019-07-05 16:25:56 -07:00
VotingPeriod time . Duration ` json:"voting_period,omitempty" yaml:"voting_period,omitempty" ` // Length of the voting period.
2018-06-21 17:19:14 -07:00
}
2019-01-22 09:28:39 -08:00
2019-05-16 08:25:32 -07:00
// NewVotingParams creates a new VotingParams object
func NewVotingParams ( votingPeriod time . Duration ) VotingParams {
return VotingParams {
VotingPeriod : votingPeriod ,
}
}
2019-08-08 12:51:18 -07:00
// DefaultVotingParams default parameters for voting
func DefaultVotingParams ( ) VotingParams {
return NewVotingParams ( DefaultPeriod )
}
// String implements stringer interface
2019-01-22 09:28:39 -08:00
func ( vp VotingParams ) String ( ) string {
return fmt . Sprintf ( ` Voting Params :
Voting Period : % s ` , vp . VotingPeriod )
}
2019-12-10 08:48:57 -08:00
func validateVotingParams ( i interface { } ) error {
v , ok := i . ( VotingParams )
if ! ok {
return fmt . Errorf ( "invalid parameter type: %T" , i )
}
if v . VotingPeriod <= 0 {
return fmt . Errorf ( "voting period must be positive: %s" , v . VotingPeriod )
}
return nil
}
2019-01-22 09:28:39 -08:00
// Params returns all of the governance params
type Params struct {
2019-07-05 16:25:56 -07:00
VotingParams VotingParams ` json:"voting_params" yaml:"voting_params" `
TallyParams TallyParams ` json:"tally_params" yaml:"tally_params" `
DepositParams DepositParams ` json:"deposit_params" yaml:"deposit_parmas" `
2019-01-22 09:28:39 -08:00
}
func ( gp Params ) String ( ) string {
return gp . VotingParams . String ( ) + "\n" +
gp . TallyParams . String ( ) + "\n" + gp . DepositParams . String ( )
}
2019-08-08 12:51:18 -07:00
// NewParams creates a new gov Params instance
2019-01-22 09:28:39 -08:00
func NewParams ( vp VotingParams , tp TallyParams , dp DepositParams ) Params {
return Params {
VotingParams : vp ,
DepositParams : dp ,
TallyParams : tp ,
}
}
2019-08-08 12:51:18 -07:00
// DefaultParams default governance params
func DefaultParams ( ) Params {
return NewParams ( DefaultVotingParams ( ) , DefaultTallyParams ( ) , DefaultDepositParams ( ) )
}