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"
2019-06-05 16:26:17 -07:00
params "github.com/cosmos/cosmos-sdk/x/params/subspace"
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
2019-05-27 17:47:12 -07:00
func ParamKeyTable ( ) params . KeyTable {
return params . NewKeyTable (
ParamStoreKeyDepositParams , DepositParams { } ,
ParamStoreKeyVotingParams , VotingParams { } ,
ParamStoreKeyTallyParams , TallyParams { } ,
)
}
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-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-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 )
}
// 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 ( ) )
}